2013-05-08 2 views
5

अच्छा दिन का उपयोग कर एक पीएफएक्स प्रमाण पत्र से X509 डेटा प्राप्त करें। स्टैकओवरफ्लो ने मुझे कई बार पहले मदद की है, लेकिन मैं इस पर थोड़ा फंस गया हूं और उम्मीद करता हूं कि कोई मुझे कुछ पॉइंटर्स दे सकता है।CryptoAPI

पृष्ठभूमि: मुझे अपने एक्रोबैट प्लगइन एपीआई का उपयोग करके पीडीएफ पर हस्ताक्षर करने के लिए एडोब के एसडीके सर्टलिस्ट कैब को प्रमाण पत्र के एक्स 50 9 डेटा को पास करने की आवश्यकता है।

मेरा सवाल है कि मैं CryptoAPI का उपयोग कर एक पीएफएक्स प्रमाण पत्र से X509 डेटा कैसे प्राप्त कर सकता हूं?

मैं निम्न कार्य किया है:

  • एक में स्मृति की दुकान में मेरी PFX प्रमाण पत्र परिवर्तित।

    CRYPT_DATA_BLOB data;

  • ओपन फाइल और पॉप्युलेट डेटा।

    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);

  • प्रमाण पत्र प्राप्त करें। सिर्फ एक ही है।

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

  • प्रमाण पत्र के लिए सार्वजनिक कुंजी जानकारी प्राप्त करें।

    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));

  • अब मैं X509 डेटा के लिए जगह बनाने के लिए प्रयास करें।

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

    x509Data = (BYTE*)malloc(dwX509Len);

  • मैं अपने बफर में गुजरती हैं।

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

जब मैं अपने कार्यक्रम चलाने मैं CryptGetKeyParam के लिए त्रुटि प्राप्त:

NTE_BAD_TYPE: dwParam पैरामीटर एक अज्ञात मूल्य संख्या निर्दिष्ट करता है।

docs के अनुसार:

KP_CERTIFICATE: pbData एक बफर कि X.509 प्रमाणपत्र गणमान्य एन्कोडिंग रूल्स (DER) का उपयोग कर इनकोडिंग किया गया है प्राप्त करता है का पता है। प्रमाणपत्र में सार्वजनिक कुंजी को संबंधित हस्ताक्षर या एक्सचेंज कुंजी से मेल खाना चाहिए।

क्या मैं कुछ गलत कर रहा हूं? X509 डेटा प्राप्त करने का कोई और तरीका है? किसी भी मदद की सराहना की जाएगी।

सादर, Magda

उत्तर

2

जैसे मैं इस मुद्दे पर-जटिल दिया है।

hContext->pbCertEncoded 
hContext->cbCertEncoded 

मुझे वह डेटा देगा जो मैं चाहता हूं।

फिर भी समझ में नहीं आता क्यों KP_CERTIFICATE का उपयोग कर X509 डेटा प्राप्त नहीं था ...

+0

आप मेरा दिन बचा लिया। धन्यवाद – nommyravian