2011-08-30 38 views
12

से प्रमाण पत्र पढ़ें और प्रमाणित करें मैं हस्ताक्षरित निष्पादन योग्य छवियों के प्रमाणपत्र प्रमाणित करना चाहता हूं (सत्यापन के द्वारा, मेरा मतलब यह है कि हस्ताक्षर एमएस/एडोब/ओरेकल आदि से आता है)। क्या विंडोज़ इस काम के लिए एपीआई प्रदान करता है? मुझे यह कैसे करना चाहिए, कोई विचार नहीं। किसी भी सहायता की सराहना की जाएगी। मैं विंडोज और सी ++ का उपयोग कर रहा हूं। मैं देशी निष्पादन योग्य छवियों को मान्य करना चाहता हूं, न कि .NET असेंबली या जावा जार फ़ाइलें।निष्पादन योग्य

अद्यतन


ठीक है, मैं वर्णन करने के लिए क्या मैं शीघ्र ही चाहते हैं की कोशिश करेंगे।

1) पीई प्रमाण पत्र मान्य करें। हस्ताक्षर मान्य है या नहीं। यह काम करना चाहिए जब पीई में हस्ताक्षर एम्बेडेड होता है और जब हस्ताक्षर सुरक्षा कैटलॉग में होता है। (मुझे यह sysinternals मंच पर मिला और ठीक काम करता है, इसलिए मुझे अब इसकी आवश्यकता नहीं है)।

2) फ़ाइल के हस्ताक्षरकर्ता/प्रकाशक को बताएं। मुझे पता है कि इसे CryptQueryObject के माध्यम से हासिल किया जा सकता है (मुझे एक कामकाजी उदाहरण मिला, हालांकि यह सुरक्षा कैटलॉग के साथ काम नहीं करता है), लेकिन यह नहीं पता कि सुरक्षा कैटलॉग फ़ाइलों के साथ इसका उपयोग कैसे किया जाए।

उत्तर

20

कई एपीआई हैं और दृष्टिकोण करते हैं कि आप निष्पादन योग्य के हस्ताक्षर कैसे प्राप्त कर सकते हैं और सत्यापित कर सकते हैं और आपको अन्य अतिरिक्त जानकारी कैसे प्राप्त हो सकती है। समस्या यह है कि आप किस स्तर का चयन करते हैं (उच्च स्तर WinVerifyTrust)

सीएटी या EXE फ़ाइल से क्रिप्टोग्राफी संदर्भ प्राप्त करने के लिए उपयोग किया जा सकता है सबसे आसान पहला एपीआई CryptQueryObject फ़ंक्शन है। KB323809 से कोड उदाहरण आपको मुख्य जानकारी प्राप्त कर सकता है कि आपको जो जानकारी चाहिए उसे डीकोड कैसे करें। यदि आप सीएटी फाइलों के साथ काम करते हैं तो मुख्य अंतर यह है कि आपको CryptQueryObject के कुछ पैरामीटर को संशोधित करना चाहिए। मैं सुझाव है कि आप सिर्फ CERT_QUERY_CONTENT_FLAG_ALL और CERT_QUERY_FORMAT_FLAG_ALL और CryptQueryObject उपयोग करने के लिए सभी क्या आप आंतरिक की जरूरत को पूरा करेगा:

BOOL bIsSuccess; 
DWORD dwEncoding, dwContentType, dwFormatType; 
HCERTSTORE hStore = NULL; 
HCRYPTMSG hMsg = NULL; 
PVOID pvContext = NULL; 

// fill szFileName 
... 

// Get message handle and store handle from the signed file. 
bIsSuccess = CryptQueryObject (CERT_QUERY_OBJECT_FILE, 
           szFileName, 
           CERT_QUERY_CONTENT_FLAG_ALL, 
           CERT_QUERY_FORMAT_FLAG_ALL, 
           0, 
           &dwEncoding, 
           &dwContentType, 
           &dwFormatType, 
           &hStore, 
           &hMsg, 
           &pvContext); 

मूल्य dwContentTypeCryptQueryObject द्वारा निर्धारित आप फ़ाइल szFileName के प्रकार के बारे आधार जानकारी मिल जाएगी। pvContext आपको सबसे अधिक मामलों के लिए PCCERT_CONTEXT होगा, लेकिन यह PCCRL_CONTEXT या PCCTL_CONTEXT भी हो सकता है यदि आप इनपुट के रूप में .ctl या .crl फ़ाइल का उपयोग करते हैं। आपको hStore फ़ाइल szFileName फ़ाइल से सभी प्रमाणपत्रों से भरा होगा। तो pvContext और hStore के संबंध में आप CryptoAPI के साथ फ़ाइल की जांच कर सकते हैं। यदि आप निम्न-स्तरीय मालिश API पसंद करते हैं तो आप hMsg का उपयोग कर सकते हैं जो अतिरिक्त dwContentType (कम से कम CERT_QUERY_CONTENT_PKCS7_SIGNED, CERT_QUERY_CONTENT_PKCS7_UNSIGNED, CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED) के मामले में सेट किया जाएगा।

फ़ाइल के हस्ताक्षर मैं तुम्हें CertGetCertificateChain और CertVerifyCertificateChainPolicy न केवल कि प्रमाण पत्र सामान्य रूप में मान्य है सत्यापित करने के लिए उपयोग करने के लिए सिफारिश करेंगे सत्यापित करने के लिए, लेकिन यह (या इसके सभी माता पिता) Authenticode (szOID_PKIX_KP_CODE_SIGNING) के लिए मान्य है। CertGetCertificateChain विभिन्न निरसन परिदृश्यों के लिए उपयोग किया जा सकता है।आपको CERT_CHAIN_POLICY_AUTHENTICODE और CERT_CHAIN_POLICY_AUTHENTICODE_TS के साथ दो अलग-अलग कॉल करना चाहिए ताकि यह सत्यापित किया जा सके कि प्रमाणीकरण श्रृंखला नीति और प्रमाणीकरण समय स्टाम्प श्रृंखला नीति दोनों मान्य हैं।

UPDATED: मैं अपने वर्तमान प्रश्न (अद्यतन भाग) को पुन: पढ़ने। आपकी वर्तमान समस्या फ़ाइल के हस्ताक्षरकर्ता/प्रकाशक को कैसे प्राप्त करें। तो मैं केवल सवाल पर जवाब देता हूं।

आप हस्ताक्षर सत्यापन के लिए the code from sysinternal का उपयोग करते हैं तो आप सिर्फ लाइन

if (!CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0)) 

बयान चौखट मामले में InfoStruct के क्षेत्र सेट है कि फाइल सिस्टम विंडोज़ फ़ाइल जो हस्ताक्षर सम्मान के साथ सत्यापित किया जाता है के लिए खोज करना चाहिए कुछ .cat फ़ाइल का। क्षेत्र InfoStruct.wszCatalogFile आपको .cat फ़ाइल का नाम प्राप्त करेगा।

उदाहरण के लिए मेरे विंडोज 7 पर अगर मैं C:\Windows\explorer.exe फ़ाइल के डिजिटल हस्ताक्षर को सत्यापित करने का प्रयास करता हूं, तो .cat जहां उसका हैश पाया जा सकता है C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat है।

आप CryptQueryObject के मापदंडों से ऊपर वर्णित के साथ KB323809 से कोड का प्रयोग करेंगे, तो आप C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat की SPC_SP_OPUS_INFO_OBJID ("1.3.6.1.4.1.311.2.1.12") विशेषता (समारोह GetProgAndPublisherInfo देखें) डिकोड जाएगा और आप

पता चल जाएगा
pwszProgramName: "Windows Express Security Catalogs" 
pPublisherInfo: NULL 
pMoreInfo->dwLinkChoice: SPC_URL_LINK_CHOICE 
pMoreInfo->pwszUrl "http://www.microsoft.com" 

इसलिए फ़ाइल के लिए कोई विशेष प्रकाशक जानकारी शामिल नहीं है। आप सूची का हस्ताक्षरकर्ता की जांच-पड़ताल आपको पता चल जाएगा कि:

The signer of the .cat file: "Microsoft Windows" 
The signer signed it with the certificate: 
    Serial Number: 0x6115230F00000000000A 
    Issuer Name: Microsoft Windows Verification PCA 
    Full Issuer Name: 
     CN = Microsoft Windows Verification PCA 
     O = Microsoft Corporation 
     L = Redmond 
     S = Washington 
     C = US 
    Subject Name: Microsoft Windows 
    Full Subject Name: 
     CN = Microsoft Windows 
     OU = MOPR 
     O = Microsoft Corporation 
     L = Redmond 
     S = Washington 
     C = US 
The Date of TimeStamp : 28.02.2011 21:16:36 
TimeStamp Certificate: 
    Serial Number: 0x6103DCF600000000000C 
    Issuer Name: Microsoft Time-Stamp PCA 
    Subject Name: Microsoft Time-Stamp Service 

तो आप बस .cat फ़ाइल का हस्ताक्षरकर्ता का उपयोग करना चाहिए, क्योंकि वहाँ explorer.exe का कोई अन्य हस्ताक्षरकर्ता है।

+0

आपको बहुत धन्यवाद और +1, मैं आपके समय की सराहना करता हूं। हालांकि मुझे अभी भी कुछ समस्याएं हैं, धन्यवाद, मुझे लगता है कि मैं पहले से लक्ष्य के करीब हूं :)। जब मैं CryptQueryObject (explorer.exe पर) कहता हूं, तो यह एक त्रुटि कोड 80092009 देता है जिसका अर्थ है "ऑब्जेक्ट को खोजने का प्रयास करते समय कोई मिलान नहीं।" मुझे लगता है कि यह explorer.exe (?) के लिए कैटलॉग नहीं मिला। आपके प्रयास के लिए बहुत बहुत धन्यवाद :) – Davita

+0

@ डेविटा: यदि आप किसी भी टेक्स्ट फ़ाइल या किसी भी हस्ताक्षरित निष्पादन योग्य फ़ाइल (जैसे एक्सप्लोरर) की जांच करने का प्रयास करेंगे।exe) 'CryptQueryObject' के संबंध में आपको [CRYPT_E_NO_MATCH] (http://msdn.microsoft.com/en-us/library/aa909166.aspx) त्रुटि प्राप्त होगी। यदि आप explorer.exe के गुणों की जांच करते हैं तो आपको कोई "डिजिटल हस्ताक्षर" टैब नहीं दिखाई देगा, इसलिए फ़ाइल अभी हस्ताक्षरित नहीं है। अगर आपको कार्यान्वयन में अन्य समस्याएं होंगी तो आप मुझसे पूछ सकते हैं। कुछ साल पहले मैं कोड पर हस्ताक्षर किए गए EXE, CAT आदि में कई बार व्यतीत करता हूं। तो शायद मैं जल्दी से आपकी मदद कर पाऊंगा। – Oleg

+0

बहुत धन्यवाद ओलेग, मैं वास्तव में आपके प्रयास की सराहना करता हूं। अभी भी कुछ भ्रम है। http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html <- जब मैं इस कोड के साथ explorer.exe की जांच करता हूं, WinVerifyTrust बताता है कि हस्ताक्षर मान्य है। क्या मुझे कुछ याद आ रहा है या पीई हस्ताक्षर और कैटलॉग फाइलों का अलग-अलग उद्देश्य है? इस बेवकूफ सवाल के लिए खेद है, मुझे वास्तव में यह काम करने की ज़रूरत है :(धन्यवाद फिर से – Davita

3

WinVerifyTrust फ़ंक्शन किसी निर्दिष्ट ऑब्जेक्ट पर ट्रस्ट सत्यापन कार्रवाई करता है। फ़ंक्शन एक ट्रस्ट प्रदाता से पूछताछ पास करता है जो कि यदि कोई मौजूद है, तो कार्रवाई पहचानकर्ता का समर्थन करता है।

प्रमाण पत्र सत्यापन के लिए, CertGetCertificateChain और CertVerifyCertificateChainPolicy फ़ंक्शंस का उपयोग करें।

+0

धन्यवाद जॉन के तीसरे पैरामीटर में CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED बजाय CERT_QUERY_CONTENT_FLAG_ALL कोशिश करने के लिए है, मैं MSDN द्वारा प्रदान उदाहरण की कोशिश की और यह बहुत अच्छा काम करता है लगभग हर, जब मैं इस तरह के रूप खिड़कियों कोर फ़ाइलें सत्यापित करने का प्रयास को छोड़कर explorer.exe। यह कहता है कि explorer.exe पर हस्ताक्षर नहीं है, लेकिन PeExplorer मुझे बताता है कि explorer.exe का हस्ताक्षर सत्यापित है। मैं उलझन में हूं कि मैं क्या खो रहा हूं ... – Davita

+1

सिस्टम फ़ाइलों को उनके हैंश को एक कैटलॉग फ़ाइल में संग्रहीत किया गया है जो हस्ताक्षरित है। यहां कोड देखें: http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html –

+0

@ बेवन कॉलिन्स, बहुत बहुत धन्यवाद, यह ठीक काम करता है :) क्या आप कृपया बता सकते हैं मुझे प्रमाणपत्र प्रमाण पत्र कैसे प्राप्त करना चाहिए, जैसे प्रमाणपत्र पर हस्ताक्षर किए गए? धन्यवाद – Davita

1

@ डेविटा मैंने उपरोक्त समस्या को पूरी तरह से पढ़ा और इसे हल करने का प्रयास किया।

मेरे सुझाव CryptQueryObject()

संबंधित मुद्दे