Propagación de certificados almacenados en un proveedor de almacén de claves CNG

1

Estoy desarrollando un proveedor de almacén de claves CNG (KSP) que almacenará claves y certificados de forma remota en un servidor back-end para ser utilizado no solo en Windows, sino también en otros sistemas operativos sin la necesidad de exportar / importar varias veces. Cada sistema operativo tendrá su propio controlador.

Actualmente estoy investigando cómo hacerle saber a Windows que mi KSP tiene certificados personales que deben estar disponibles para otras aplicaciones usando CryptoAPI, como los navegadores.

He leído que, al usar tarjetas inteligentes, este procedimiento lo realiza el "Servicio de Propagación de Certificados", que advierte cuando se inserta una tarjeta inteligente y luego copia los certificados al "MI" almacén de certificados del usuario actual.

¿Cómo hacer la propagación de certificados disponibles en el KSP? Si llamo a CertAddEncodedCertificateToStore pidiendo que ponga el certificado en la tienda "MY", ¿hará el truco de persistir el certificado para futuras sesiones? Si es así, me imagino que cuando alguna aplicación llame a CryptAcquireCertificatePrivateKey con ese certificado como parámetro, CryptoAPI le pedirá al KSP una referencia a la clave privada, ¿verdad?

    
pregunta Fabiano Pereira 31.01.2017 - 15:34
fuente

1 respuesta

1

Después de cavar mucho y hacer muchas pruebas, finalmente encontré una manera de "propagar" el certificado. Esto es lo que debe hacerse para que CryptoAPI sepa que su KSP tiene certificados de usuario:

  1. Cree un contexto de certificado usando CertCreateCertificateContext pasando la codificación DER del certificado deseado;
  2. Crea un CRYPT_KEY_PROV_INFO provInfo y establece los campos:

    • Establezca pwszContainerName en una cadena de su elección, solo para identificar la clave internamente;
    • Establezca el campo pwszProvName con el nombre de su proveedor. Así es como CryptoAPI sabe que su KSP guarda la clave privada correspondiente a este certificado;
    • Establezca dwKeySpec en AT_SIGNATURE ;
    • Los otros campos pueden ser NULL .
  3. Asocie provInfo al contexto llamando a CertSetCertificateContextProperty usando CERT_KEY_PROV_INFO_PROP_ID como el ID de la propiedad;

  4. Abra la tienda "MY" llamando a CertOpenSystemStore(NULL, L"MY")
  5. Agregue el contexto a la tienda llamando a CertAddCertificateContextToStore(hCertStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, NULL)

Después de esto, el certificado estará disponible para su uso en cualquier aplicación compatible con CryptoAPI, como algunos navegadores. Como ejemplo, en Internet Explorer puede acceder a la lista de certificados en: "Herramientas" menú > Submenú "Opciones de Internet" > Pestaña "Contenido" > Botón "Certificados" > Pestaña "Personal".

Cuando el usuario desee usar ese certificado para autenticarse en un sitio web (u otro uso), CryptoAPI llamará a su KSP, pasando un valor de hash que se firmará como clave privada.

    
respondido por el Fabiano Pereira 14.02.2017 - 14:01
fuente

Lea otras preguntas en las etiquetas