Perché la chiave privata non è presente per il certificato recuperato dal file di scambio di informazioni personali?

0

i dati del certificato vengono recuperati dallo scambio di informazioni personali utilizzando le seguenti API di Crypto

hCertStore = PFXImportCertStore( &data, wszPassword, CRYPT_EXPORTABLE );
            if ( !hCertStore )
            {
                hResult = GetLastError();
                __leave;
            } // if

            pUsrCertContext = CertEnumCertificatesInStore(
                hCertStore,
                pUsrCertContext );
            if( !pUsrCertContext )
            {
                hResult = GetLastError( );
                __leave;
            } // if

Il risultato di PFXImportCertStore è certificato + chiave privata. Questo certificato + chiave privata viene aggiunto all'archivio come

pUsrAuthCertContext = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
            pUsrCertContext->pbCertEncoded,
                pUsrCertContext->cbCertEncoded );
        if ( !pUsrAuthCertContext )
        {
            hResult = GetLastError();
            __leave;
        } // if
        //
        // Open the certificate store to add certificates to store
        //
        hUsrCertStore = CertOpenSystemStore(
            NULL,
            //L"TrustedPeople" 
            L"MY");
        if ( ! hUsrCertStore )
        {
            hResult =  GetLastError( );
            __leave;
        } // if
if ( ! CertAddCertificateContextToStore(
            hUsrCertStore,
            pUsrAuthCertContext ,
            CERT_STORE_ADD_REPLACE_EXISTING,
            0 ) )
        {
            hResult = GetLastError( );
            __leave;
        } // if

Ora questo certificato viene aggiunto all'archivio ma non ha la chiave privata con esso. Qual è la bandiera che ho dimenticato di specificare per aggiungere il certificato insieme alla chiave privata?

    
posta user5271376 04.03.2016 - 12:18
fonte

1 risposta

0

Il collegamento dal certificato alla chiave privata non è scritto nel certificato. È gestito esternamente correttamente. Quando hai chiamato CertCreateCertificateContext() , hai appena importato il certificato stesso, non il link.

Il collegamento è una combinazione di due nomi (due stringhe): il nome del CSP e il nome del contenitore di chiavi all'interno di quel CSP. Quando hai chiamato PFXImportCertStore() , Windows:

  1. Ha importato la chiave privata in un CSP adatto, con un nome contenitore appropriato.

  2. Creato un archivio di certificati temporanei.

  3. Spingi il certificato in quel negozio.

  4. Aggiunto un collegamento da quel certificato in quell'archivio, alla chiave privata come è stato importato nel primo passaggio.

Il tuo codice ha spinto il certificato nell'archivio permanente (il tuo negozio "Mio") ma non ha trasferito il link. Devi ottenere i nomi CSP e container dal certificato nell'archivio temporaneo e impostare tali informazioni sul contesto restituito da CertCreateCertificateContext() . Questa operazione viene eseguita con CertGetCertificateContextProperty() e CertSetCertificateContextProperty() , utilizzando CERT_KEY_PROV_INFO_PROP_ID proprietà. I nomi rilevanti (CSP e nome del contenitore) e gli altri flag viaggiano come CRYPT_KEY_PROV_INFO struttura.

    
risposta data 04.03.2016 - 15:03
fonte

Leggi altre domande sui tag