Ho implementato un fornitore di archiviazione di chiavi CNG e diffondo il mio certificato in base alla risposta a questa domanda al mio negozio. Posso vedere il mio certificato lì usando la console MMC. Tuttavia, quando un sito Web richiede il certificato per l'autenticazione reciproca, il browser (Chrome, Firefox, Edge) non mostra il certificato per la selezione.
Per prima cosa ho pensato che potesse essere un problema con l'utilizzo della chiave, ma se richiedo un certificato per lo stesso modello di certificato per memorizzarlo su una smart-card viene mostrato dal browser (La smart-card usa i provider standard ).
Quindi penso che abbia qualcosa da fare con il mio fornitore di archiviazione di chiavi, ma non riesco a capire cosa sia sbagliato né ho la minima idea su come rintracciare il problema.
Alcune fonti nel web dicono che il CNG non è supportato per l'autenticazione reciproca, ma sono piuttosto vecchi e la soluzione menzionata afferma il contrario, quindi sono abbastanza insicuro se ciò che sto cercando di ottenere è assolutamente possibile.
Modifica
Aggiunta del codice per la propagazione (forse il colpevole per il comportamento):
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
Alla fine ho ottenuto la propagazione del certificato in modo tale che venga visualizzato da Chrome e IE (sembra che si tratti di un problema di tempalte certificato). Inoltre certutil -verifystore
mi dice che la firma ha avuto successo e il certificato è valido. Quando uso certutil viene chiamato il mio KSP e in grado di eseguire l'operazione di firma.
Tuttavia, quando seleziono il certificato per l'autenticazione nel browser, l'autenticazione fallisce con l'HTTP 403. Guardando nei miei log KSP vedo che non viene chiamato. C'è altro che devo fare quando registro il mio KSP o il certificato per farlo funzionare?