Propagazione dei certificati archiviati in un fornitore di keystore CNG

1

Sto sviluppando un fornitore di keystore (KSP) per CNG che memorizzerà chiavi e certificati da remoto in un server back-end per poter essere utilizzato non solo su Windows, ma anche su altri sistemi operativi senza la necessità di esportare / importare più volte, ogni sistema operativo avrà il proprio driver.

Attualmente sto studiando come far sapere a Windows che il mio KSP ha certificati personali che devono essere disponibili ad altre app che utilizzano CryptoAPI, come i browser.

Ho letto che, quando si usano le smartcard, questa procedura viene eseguita dal "Certificate Propagation Service", che rileva quando viene inserita una smart card e quindi copia i certificati nell'archivio certificati "MY" dell'utente corrente.

Come si fa la propagazione dei certificati disponibili nel KSP? Se chiamo CertAddEncodedCertificateToStore chiedendo di inserire il certificato nel negozio "MY", farà il trucco persistendo il certificato per le sessioni future? Se è così, immagino che quando alcune app chiamano CryptAcquireCertificatePrivateKey con quel certificato come parametro, CryptoAPI chiederà al KSP un riferimento alla chiave privata, giusto?

    
posta Fabiano Pereira 31.01.2017 - 15:34
fonte

1 risposta

1

Dopo aver scavato molto e fatto un sacco di test, ho finalmente trovato un modo per "propagare" il certificato. Questo è ciò che deve essere fatto in modo che CryptoAPI sappia che il tuo KSP ha i certificati utente:

  1. Crea un contesto certificato utilizzando CertCreateCertificateContext passando la codifica DER del certificato desiderato;
  2. Crea un CRYPT_KEY_PROV_INFO provInfo e imposta i campi:

    • Imposta pwszContainerName su una stringa a tua scelta, solo per identificare la chiave internamente;
    • Imposta il campo pwszProvName sul nome del tuo provider. In questo modo CryptoAPI sa che la chiave privata corrispondente a questo certificato è conservata dal tuo KSP;
    • Imposta dwKeySpec su AT_SIGNATURE ;
    • Gli altri campi possono essere NULL .
  3. Associare provInfo al contesto chiamando CertSetCertificateContextProperty utilizzando CERT_KEY_PROV_INFO_PROP_ID come ID proprietà;

  4. Apri lo store "MY" chiamando CertOpenSystemStore(NULL, L"MY")
  5. Aggiungi il contesto allo store chiamando CertAddCertificateContextToStore(hCertStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, NULL)

Dopo questo, il certificato sarà disponibile per l'uso in qualsiasi applicazione compatibile con CryptoAPI, come alcuni browser. Ad esempio, in Internet Explorer è possibile accedere all'elenco dei certificati in: menu "Strumenti" > Sottomenu "Opzioni Internet" > Scheda "Contenuto" > Pulsante "Certificati" > Scheda "Personale".

Ogni volta che l'utente vuole usare quel certificato per autenticarsi in un sito web (o altro uso), CryptoAPI chiamerà il tuo KSP, passando un valore di hash da firmare come chiave privata.

    
risposta data 14.02.2017 - 14:01
fonte

Leggi altre domande sui tag