2

CryptoAPI で CertEnumCertificatesInStore() を使用して、すべてのルート証明書を反復処理し、それらを OpenSSL で使用するために PEM ファイルにエンコードしようとしています。これのいくつかの例を見つけたので、可能だと思われますが、各証明書に対して返される PCCERT_CONTEXT には、pbCertEncoded と cbCertEncoded (バッファー サイズ) の無効なポインターが常に 0 ですが、これはそうあるべきではないと思いますこの例では、エンコードされたバッファを使用して証明書を他の形式に変換します。空のバッファを取得するというこの問題に遭遇した人はいますか、それとも私が見逃しているステップを見ることができますか?

CryptUIDlgViewContext() 関数を使用して実際に証明書を取得していることを確認しました。私は非常に基本的な何かが欠けているように感じます。以下の基本的なコード:

HCERTSTORE hStore = CertOpenSystemStore(NULL, L"ROOT");

for ( PCCERT_CONTEXT pCertContext = CertEnumCertificatesInStore(hStore, NULL); pCertContext != NULL; pCertContext = CertEnumCertificatesInStore(hStore, pCertContext) )
    {

        // This shows the certificates fine
        CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT,  pCertContext, NULL, NULL, 0, NULL)

        // but
        // pCertContext->pbCertEncoded is a Bad Ptr and
        // pCertContext->cbCertEncoded is always 0

        // If i try
        TCHAR *OutString = NULL;
        DWORD Size = 0;
        DWORD lastError;
        BOOL success = CryptBinaryToString(pCertContext->pbCertEncoded, pCertContext->cbCertEncoded, CRYPT_STRING_BASE64,OutString, &Size); 

        if( !success )
        {
            // I get a invalid parameter error here.
            lastError = GetLastError();
        }        
    }
4

1 に答える 1

0

64 ビットでコンパイルすると、エンコードされたバッファがいっぱいになりません。32 ビットでコンパイルすると、この問題は解決するようです。

于 2012-09-25T16:42:37.860 に答える