He implementado un proveedor de almacenamiento de claves CNG y propagé mi certificado de acuerdo con la respuesta a esta pregunta a la tienda MY. Puedo ver mi certificado allí usando la consola MMC. Sin embargo, cuando un sitio web requiere el certificado para la autenticación mutua, el navegador (Chrome, Firefox, Edge) no muestra el certificado de selección.
Primero pensé que podría ser un problema con el uso de la clave, pero si solicito un certificado para la misma plantilla de certificado para almacenarlo en una tarjeta inteligente, el navegador lo muestra (la tarjeta inteligente utiliza los proveedores estándar ).
Así que creo que tiene algo que ver con mi proveedor de almacenamiento de claves, pero no puedo descubrir qué es lo que está mal ni tengo la menor idea de cómo localizar el problema.
Algunas fuentes en la web dicen que CNG no es compatible con la autenticación mutua, pero son bastante antiguas y la solución mencionada dice lo contrario, por lo que no estoy seguro de que lo que estoy tratando de lograr sea posible.
EDIT
Agregar el código de propagación (quizás el culpable del comportamiento):
CRYPT_KEY_PROV_INFO newProvInfo;
newProvInfo.pwszProvName = KEY_PROVIDER_NAME;
newProvInfo.dwProvType = 0;
SHStrDupW(keyName, &newProvInfo.pwszContainerName);
newProvInfo.dwKeySpec = AT_SIGNATURE;
newProvInfo.dwFlags = 0;
newProvInfo.cProvParam = 0;
newProvInfo.rgProvParam = nullptr;
CertSetCertificateContextProperty(pcCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &newProvInfo);
CertAddCertificateContextToStore(certStoreHandle, pcCertContext, CERT_STORE_ADD_REPLACE_EXISTING, nullptr)
EDIT 2
Finalmente conseguí que el certificado se propagara de manera tal que se muestra en Chrome e IE (parece que fue un problema de tempalte del certificado). Además, certutil -verifystore
me dice que la firma fue exitosa y que el certificado es válido. Cuando uso certutil, se llama a mi KSP y es capaz de realizar la operación de firma.
Sin embargo, cuando selecciono el certificado para la autenticación en el navegador, la autenticación falla con HTTP 403. Al buscar en mis registros KSP veo que no se llama. ¿Hay algo más que deba hacer al registrar mi KSP o el certificado para que esto funcione?