2013-05-08 40 views
5

Ngày tốt lành. Stackoverflow đã giúp tôi nhiều lần trước đây, nhưng tôi có một chút khó khăn về điều này và hy vọng rằng ai đó có thể cho tôi một số gợi ý.Nhận dữ liệu X509 từ chứng chỉ PFX bằng CryptoAPI

Thông tin cơ bản: Tôi cần chuyển dữ liệu X509 của chứng chỉ sang chứng nhận SDK của Adobe SDK để ký PDF bằng cách sử dụng plugin aprobat Acrobat của tôi.

Câu hỏi của tôi là làm cách nào để lấy dữ liệu X509 từ chứng chỉ PFX bằng CryptoAPI?

Tôi đã làm như sau:

  • Chuyển đổi giấy chứng nhận PFX của tôi đến một cửa hàng trong bộ nhớ.

    CRYPT_DATA_BLOB data;

  • mở tập tin và cư dữ liệu.

    FILE *fIn = fopen("C:\\certificate\\MyPfx.pfx", "rb") 
        fseek(fIn, 0, SEEK_END); 
        data.cbData = ftell(fIn); 
        fseek(fIn, 0, SEEK_SET); 
        data.pbData = (BYTE *)malloc(data.cbData); 
        fread(data.pbData, 1, data.cbData, fIn); 
        fclose(fIn); 
    

    HCERTSTORE hCertStore = PFXImportCertStore(&data, L"password", 0);

  • Tìm các chứng chỉ. Chỉ có một.

    PCCERT_CONTEXT hContext = CertFindCertificateInStore (hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);

  • Lấy thông tin quan trọng nào cho chứng chỉ.

    BOOL bFreeHandle; HCRYPTPROV hProv; DWORD dwKeySpec; HCRYPTKEY hCertPubKey; CryptAcquireCertificatePrivateKey (hContext, 0, NULL, &hProv, &dwKeySpec, &bFreeHandle);

    CryptImportPublicKeyInfo(hProv, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &hContext->pCertInfo->SubjectPublicKeyInfo, &hCertPubKey));

  • Bây giờ tôi cố gắng để làm cho không gian cho dữ liệu X509.

    DWORD dwX509Len; BYTE *x509Data; CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,NULL,&dwX509Len,0);

    x509Data = (BYTE*)malloc(dwX509Len);

  • tôi vượt qua trong bộ đệm của tôi.

    CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,x509Data,&dwX509Len,0);

Khi tôi chạy chương trình của tôi, tôi nhận được lỗi cho CryptGetKeyParam:

NTE_BAD_TYPE: Tham số dwParam xác định một số giá trị không rõ.

Theo docs:

KP_CERTIFICATE: pbData là địa chỉ của một bộ đệm mà nhận được chứng chỉ X.509 đã được mã hóa bằng cách sử dụng quy Encoding sắc (DER). Khóa công khai trong chứng chỉ phải khớp với chữ ký hoặc khóa trao đổi tương ứng.

Tôi có làm gì sai không? Có cách nào khác để lấy dữ liệu x509 không? Mọi trợ giúp sẽ được đánh giá cao.

Kính trọng, Magda

Trả lời

2

Hình như tôi đã quá phức tạp vấn đề.

hContext->pbCertEncoded 
hContext->cbCertEncoded 

Sẽ cung cấp cho tôi dữ liệu tôi muốn.

Vẫn không hiểu tại sao sử dụng KP_CERTIFICATE không lấy dữ liệu X509 ...

+0

Bạn lưu ngày của tôi. cảm ơn – nommyravian

Các vấn đề liên quan