¿Por qué la clave privada no está presente para el certificado recuperado del archivo de intercambio de información personal?

0

los datos del certificado se recuperan del intercambio de información personal mediante las siguientes API de Crypto

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

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

El resultado de PFXImportCertStore es certificado + clave privada. Este certificado + clave privada se agrega a la tienda como

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

Ahora este certificado se agrega a la tienda pero no tiene la clave privada con él. ¿Cuál es el indicador que no pude especificar para agregar el certificado junto con la clave privada?

    
pregunta user5271376 04.03.2016 - 12:18
fuente

1 respuesta

0

El enlace del certificado a la clave privada no está escrito en el certificado. Es un mantenimiento externo adecuado. Cuando llamó a CertCreateCertificateContext() , solo importó el certificado, no el enlace.

El enlace es una combinación de dos nombres (dos cadenas): el nombre del CSP y el nombre del contenedor de claves dentro de ese CSP. Cuando llamaste a PFXImportCertStore() , Windows:

  1. Importó la clave privada en un CSP adecuado, con un nombre de contenedor adecuado.

  2. Creó un almacén de certificados temporal.

  3. Insertó el certificado en esa tienda.

  4. Agregó un enlace de ese certificado en esa tienda a la clave privada tal como se importó en el primer paso.

Su código insertó el certificado en la tienda permanente (su "Mi" tienda) pero no transportó el enlace. Debe obtener los nombres de CSP y de contenedor del certificado en el almacén temporal y configurar esa información en el contexto devuelto por CertCreateCertificateContext() . Esto se hace con CertGetCertificateContextProperty() y CertSetCertificateContextProperty() , usando CERT_KEY_PROV_INFO_PROP_ID propiedad. Los nombres relevantes (CSP y nombre del contenedor) y las banderas adicionales viajan como un estructura CRYPT_KEY_PROV_INFO .

    
respondido por el Tom Leek 04.03.2016 - 15:03
fuente

Lea otras preguntas en las etiquetas