आपको RFC3280 section 6.1 और RFC5280 section 6.1 से अवगत होना चाहिए। प्रमाण पत्र पथ मान्य करने के लिए दोनों एल्गोरिदम का वर्णन करते हैं। भले ही Win32 API आपके लिए कुछ चीजों का ख्याल रखता है, फिर भी सामान्य रूप से प्रक्रिया के बारे में जानने के लिए यह मूल्यवान हो सकता है।
इसके अलावा, यहां एक (मेरी राय में) बहुत भरोसेमंद संदर्भ है: Chromium certificate verification code।
कुल मिलाकर, मुझे लगता है कि आपका कोड गलत नहीं है। लेकिन यहाँ, कुछ चीजें मैं में/परिवर्तन देखने होता है कि अगर मैं तुम्हें थे:
1. अलग सामान्य नाम मान्यता
क्रोमियम श्रृंखला से अलग से प्रमाणपत्र आम नाम सत्यापित करता है। जाहिर है, उन्होंने इसके साथ कुछ समस्याएं देखी हैं। उनके तर्क के लिए टिप्पणियां देखें:
cert_verify_proc.win.cc:731 // Certificate name validation happens separately, later, using an internal
cert_verify_proc.win.cc:732 // routine that has better support for RFC 6125 name matching.
2. उपयोग CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT
क्रोमियम भी CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT झंडा बजाय CERT_CHAIN_REVOCATION_CHECK_CHAIN का उपयोग करता है। मैंने वास्तव में अपना कोड प्राप्त करने से पहले इसे देखना शुरू कर दिया, और यह मेरी धारणा को मजबूत करता है कि आपको CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT का उपयोग करना चाहिए।
भले ही दोनों उपर्युक्त आरएफसी निर्दिष्ट करते हैं कि एक आत्म-हस्ताक्षरित ट्रस्ट एंकर को श्रृंखला का हिस्सा नहीं माना जाता है, CertGetCertificateChain (http://msdn.microsoft.com/en-us/library/windows/desktop/aa376078(v=vs.85).aspx) के लिए प्रलेखन का कहना है कि यह संभवतः एक विश्वसनीय रूट प्रमाणपत्र के लिए एक श्रृंखला बनाता है। एक विश्वसनीय रूट प्रमाणपत्र को एक विश्वसनीय स्व-हस्ताक्षरित प्रमाणपत्र के रूप में परिभाषित किया जाता है (उसी पृष्ठ पर)।
यह संभावना को समाप्त करता है कि * EXCLUDE_ROOT गैर-रूट ट्रस्ट एंकर के लिए निरस्तीकरण जांच को छोड़ सकता है (Win32 वास्तव में ट्रस्ट-एंकरों को स्वयं हस्ताक्षरित होने की आवश्यकता है, भले ही इसे किसी भी आरएफसी द्वारा आवश्यक न हो। हालांकि यह आधिकारिक तौर पर नहीं है दस्तावेज)।
अब, चूंकि रूट सीए प्रमाणपत्र खुद को रद्द नहीं कर सकता है (सीआरएल हस्ताक्षरित/सत्यापित नहीं किया जा सकता है), ऐसा लगता है कि ये दो झंडे समान हैं।
मैंने कुछ मंचों को किया और इस मंच पोस्ट में ठोकर खाई: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/9f95882a-1a68-477a-80ee-0a7e3c7ae5cf/x509revocationflag-question?forum=windowssecurity। .NET उत्पाद समूह (माना जाता है) का एक सदस्य दावा करता है कि प्रकृति में झंडे समान कार्य करते हैं, यदि रूट स्वयं हस्ताक्षरित है (सिद्धांत रूप में, ENTIRE_CHAIN ध्वज रद्द करने के लिए मूल प्रमाणपत्र की जांच करेगा यदि इसमें सीडीपी एक्सटेंशन शामिल है, लेकिन वह नहीं हो सकता है)।
उन्होंने यह भी * EXCLUDE_ROOT झंडा उपयोग करने के लिए है क्योंकि अन्य झंडा, एक अनावश्यक नेटवर्क अनुरोध का कारण बन सकता है, तो स्व-हस्ताक्षरित जड़ सीए सीडीपी एक्सटेंशन शामिल सिफारिश की।
दुर्भाग्य:
- मैं दो झंडे के बीच मतभेद पर किसी भी आधिकारिक तौर पर दस्तावेज स्पष्टीकरण नहीं मिल रहा।
- हालांकि यह संभावना है कि लिंक की गई चर्चा .NET के हुड के नीचे एक ही Win32 API ध्वज पर लागू होती है, इसकी गारंटी नहीं है।
पूरी तरह से यकीन है कि यह CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT उपयोग करने के लिए ठीक है तो मुझे खुद में थोड़ा और अधिक googled और क्रोमियम SSL प्रमाणपत्र सत्यापन कोड मैं अपने जबाब के शीर्ष पर से जुड़ा हुआ पाया।
एक अतिरिक्त बोनस के रूप में, क्रोमियम cert_verify_proc_win.cc फ़ाइल आईई सत्यापन कोड के बारे में निम्नलिखित संकेत शामिल हैं:
618: // IE passes a non-NULL pTime argument that specifies the current system
619: // time. IE passes CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT as the
620: // chain_flags argument.
सुनिश्चित नहीं हैं कि वे यह जानते हैं, लेकिन इस बिंदु पर मैं का उपयोग कर सहज महसूस करता हूँ CERT_CHAIN_REVOCATION_CHECK_EXCLUDE_ROOT।
3. विभिन्न स्वीकृत प्रमाणपत्र Usages
मैंने देखा क्रोमियम भी 3 प्रमाण पत्र के बजाय प्रयोग 1 निर्दिष्ट करता है:
szOID_PKIX_KP_SERVER_AUTH,
szOID_SERVER_GATED_CRYPTO,
szOID_SGC_NETSCAPE
मैं क्या गूगल के माध्यम से इकट्ठा कर सकते हैं से, अन्य उपयोगों पुराने वेब के लिए आवश्यक हो सकता है ब्राउज़र, अन्यथा वे एक सुरक्षित कनेक्शन स्थापित करने में विफल हो सकते हैं।
यदि क्रोमियम इन उपयोगों को शामिल करने के लिए उपयुक्त मानता है, तो मैं सूट का पालन करता हूं।
ध्यान दें कि यदि आप अपना कोड बदलते हैं, तो आपको पैराम्स भी सेट करना चाहिए। USAGE_MATCH_TYPE_AND के बजाय USAGE_MATCH_TYPE_OR पर RequestedUsage.dwType।
-
मैं इस समय कोई अन्य टिप्पणी नहीं सोच सकते हैं।लेकिन अगर मैं आप थे, तो मैं क्रोमियम स्रोत स्वयं (और शायद फ़ायरफ़ॉक्स भी) देखता हूं - बस यह सुनिश्चित करने के लिए कि मैंने कुछ भी याद नहीं किया है।
आपने इसका उल्लेख नहीं किया कि आप इसका क्या उपयोग कर रहे हैं, लेकिन हां, आम तौर पर आपको CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT पास करना चाहिए यदि आप इसे एक सामान्य HTTPS परिदृश्य में उपयोग कर रहे हैं। – EricLaw
मैं मुख्य रूप से एलडीएपी सर्वर एसएसएल प्रमाण पत्र (जैसे, VERIFYSERVERCERT फ़ंक्शन के अंदर) को सत्यापित करने के लिए इसका उपयोग करना चाहता हूं। मैं क्लाइंट/सर्वर एप्लिकेशन में HTTPS सर्वर प्रमाणपत्रों को सत्यापित करने के लिए इसका उपयोग करने के बारे में सोच रहा हूं, जहां ग्राहक सर्वर के लिए अपना स्वयं का SSL प्रमाणपत्र निर्दिष्ट कर सकते हैं। – briangreenery
क्या CERT_CHAIN_REVOCATION_CHECK_CHAIN के बजाय CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT का उपयोग करना अधिक आम है? आप निरसन के लिए रूट प्रमाणपत्र क्यों नहीं देखेंगे? – briangreenery