Pergunta

Eu estou tentando certificado de exportação para o arquivo pfx. Aqui está o que eu faço (simplificado):

h = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, CERT_STORE_CREATE_NEW_FLAG, NULL); 
p = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
                  CertBlob.pbData, CertBlob.cbData);
CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID, 0, &hPrivKey);
CertAddCertificateContextToStore(h, p, CERT_STORE_ADD_ALWAYS, NULL);
PFXExportCertStoreEx(h, &SomeBlob, L"", NULL, EXPORT_PRIVATE_KEYS);

PFX criado, nenhuma chave privada exportada. Alguém já exportados chave privada para pfx? Qual é a maneira correta de anexar chave privada para certificado de modo que pudesse ser exportado?

Foi útil?

Solução

Aparentemente, CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID ...)

não é bom. Necessidade de fazer isso em vez disso:

CRYPT_KEY_PROV_INFO kpi;
ZeroMemory( & kpi, sizeof(kpi) );
kpi.pwszContainerName = "my-container-name";
kpi.dwProvType = PROV_RSA_FULL;
kpi.dwKeySpec = AT_KEYEXCHANGE;
kpi.dwFlags = CRYPT_MACHINE_KEYSET;
CertSetCertificateContextProperty( pCert, CERT_KEY_PROV_INFO_PROP_ID, 0, & kpi);

É fundamental que o nome do fornecedor e outras tretas coincidir com a informação que foi usado para gerar chave real. Não é necessário para set alça provedor ou qualquer dessas coisas. Ele também deve ser feito antes CertAddCertificateContextToStore.

Esta é a única maneira que eu encontrei para anexar chave privada para um certificado.

Outras dicas

Para a posteridade:

O problema está relacionado com a chamada CertAddCertificateContextToStore. Na verdade, ele não copia a propriedade CERT_KEY_PROV_HANDLE_PROP_ID para o próximo contexto. (Este fato é observado na observação)

Solução:

Preencher o último parâmetro com um identificador para o novo contexto e copiar a propriedade do contexto de idade para a próxima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top