देता है मैं एक HTTPS वेब सर्वर से कनेक्ट करने के लिए एक बहुत ही बुनियादी SSL क्लाइंट लिख रहा हूं। मैं अनुरोध/प्रतिक्रिया को ठीक से जोड़ और संसाधित कर सकता हूं। हालांकि ओपनएसएसएल UNABLE_TO_GET_ISSUER_CERT_LOCALLY
की रिपोर्ट कर रहा है, लेकिन अब तक मैं त्रुटि को अनदेखा करना चुनता हूं :-)। अब मैं समस्या के उस हिस्से को हल करना चाहता हूं।सार्वजनिक सर्वर से OPENSSL कनेक्शन X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
मैं Google या Yahoo जैसे HTTPS पर सार्वजनिक SSL सर्वर से कनेक्ट करके परीक्षण कर रहा हूं, और SSL_get_verify_result(...)
की वापसी की जांच कर रहा हूं।
जैसा कि मैं इसे समझता हूं, मुझे उस विशिष्ट साइट के लिए सीए पेम फ़ाइलों की आवश्यकता है ताकि ओपनएसएसएल एक विश्वसनीय प्रमाणपत्र प्राधिकरण को श्रृंखला को सत्यापित कर सके। इस मामले में, वह प्राधिकरण होगा जो Google या याहू के लिए कर्ट पर हस्ताक्षर करता है।
पीईएम फाइलें प्राप्त करने के लिए जो मुझे उम्मीद करनी चाहिए, मैंने अपना फ़ायरफ़ॉक्स खोला, उन साइटों पर नेविगेट किया, और एक व्यू प्रमाणपत्र किया और प्रत्येक को सूची में निर्यात किया। तो उदाहरण के लिए, मेरे पास "GeoTrustGlobalCA.pem" नामक एक फ़ाइल है जो सभी अच्छी लगती है। असल में, जब मैं सीधे जियोट्रस्ट साइट पर गया और अपने रूट प्रमाणपत्र को डाउनलोड किया, तो यह फ़ायरफ़ॉक्स से निर्यात किए गए एक जैसा है, जैसा कि मैं उम्मीद करता हूं।
तो, गूगल के साथ उदाहरण जो फ़ायर्फ़ॉक्स में पेड़ में दो प्रमाण पत्र से पता चला है के लिए, मैं लोड प्रत्येक के साथ एक:
result = SSL_CTX_load_verify_locations(ctx,"GoogleInternetAuthorityG2.pem",NULL);
if (result == 0) {
puts("Opps... Can't load the certificate");
}
result = SSL_CTX_load_verify_locations(ctx,"GeoTrustGlobalCA.pem",NULL);
if (result == 0) {
puts("Opps... Can't load the certificate");
}
उसके बाद, हमेशा की तरह सामान से कनेक्ट करने और संवाद करने के लिए:
BIO_set_conn_hostname(bio, "www.google.com:https");
और लोड या कनेक्ट होने पर कोई त्रुटि नहीं है।
हालांकि, सत्यापन काम नहीं करता है।
result = SSL_get_verify_result(ssl);
printf("The Verify Result is %d \n",result);
मुझे वापसी UNABLE_TO_GET_ISSUER_CERT_LOCALLY (error code 20)
मिलती है।
तो, क्या मुझे यहां कुछ अवधारणा याद आ रही है? क्या यह मुझे X509_V_OK
परिणाम नहीं देगा क्योंकि इसमें विश्वसनीय प्रमाणपत्र हैं? Google.com से श्रृंखला केवल दो थी, और मैंने उनका इस्तेमाल किया।
मैं इसकी सराहना करता हूं (मुझे ईमेल नहीं मिल रहा है कि एक जवाब था ... शायद मुझे इसके बारे में एक प्रश्न पोस्ट करना चाहिए :-)। सहकर्मी प्रमाण पत्र की जांच के लिए, न केवल तभी लागू होता है जब मैं ग्राहक को सत्यापित करना चाहता हूं? अगर मैं अज्ञात क्लाइंट की अनुमति दे रहा हूं, लेकिन सिर्फ स्नीफिंग से बचना चाहता हूं, तो यह आवश्यक नहीं है? – SpacemanScott
(हाँ, यह परीक्षण क्लाइंट के रूप में है, बस पूछ रहा है क्योंकि मुझे अंततः दोनों प्रकारों का समर्थन करने की आवश्यकता होगी) – SpacemanScott