2014-06-19 5 views
6

देता है मैं एक 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 से श्रृंखला केवल दो थी, और मैंने उनका इस्तेमाल किया।

उत्तर

2

SSL_CTX_load_verify_locations पर दूसरा कॉल प्रमाणपत्र को पहले कॉल से बदल रहा है।

आप किसी एकल फ़ाइल में अपने जड़ों को संयोजित करना चाहिए:

$ cat my-trusted-roots.pem 
-----BEGIN CERTIFICATE----- 
... (CA certificate in base64 encoding) ... 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
... (CA certificate in base64 encoding) ... 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
... (CA certificate in base64 encoding) ... 
-----END CERTIFICATE----- 

और फिर SSL_CTX_load_verify_locations साथ कि एक फ़ाइल को लोड। ओपनएसएसएल docs on SSL_CTX_load_verify_locations देखें। partuclar में, नोट अनुभाग:

तो CAFile शून्य नहीं है, यह पीईएम प्रारूप में CA प्रमाणपत्रों की एक फ़ाइल को इंगित करता है। फ़ाइल

द्वारा की पहचान कई CA प्रमाणपत्र शामिल कर सकते हैं ----- प्रमाण पत्र शुरू -----

... (बेस 64 एन्कोडिंग में CA प्रमाणपत्र) ...

---- -एंड सर्टिफिकेट -----

अनुक्रम।सर्टिफिकेट टेक्स्ट के पहले, बीच में, और बाद में की अनुमति दी जा सकती है उदा। प्रमाण पत्र के विवरण के लिए।


बस बाइक यहाँ बहा ...

result = SSL_get_verify_result(ssl); 
printf("The Verify Result is %d \n",result); 

कि तीन टेस्ट मैचों आप करने की आवश्यकता से एक है।

दूसरा परीक्षण जो आपको करने की आवश्यकता है वह नीचे है। बेनामी डिफी-हेलमैन (एडीएच) प्रमाण पत्र का उपयोग नहीं करता है, इसलिए आपको इसकी जांच करनी होगी।

X509* cert = SSL_get_peer_certificate(ssl); 
if(cert) X509_free(cert); 

if(cert == NULL) 
    /* Error - Anonymous Diffie-Hellman */ 

SSL_get_peer_certificate प्रमाण पत्र पर संदर्भ गिनती मुलाकात है, तो आप X509_free एक मिलान कॉल की जरूरत है।

तीसरा परीक्षण जो आपको करने की आवश्यकता है होस्टनाम मिलान है। ओपनएसएसएल 1.1.0 होस्टनाम मिलान (और अन्य नाम मिलान, जैसे पीकेसीएस 9 ईमेल पते) प्रदर्शन करेगा; लेकिन 0.9.8 और 1.0.1, जैसे कम संस्करण, मिलान नहीं करते हैं।

+0

मैं इसकी सराहना करता हूं (मुझे ईमेल नहीं मिल रहा है कि एक जवाब था ... शायद मुझे इसके बारे में एक प्रश्न पोस्ट करना चाहिए :-)। सहकर्मी प्रमाण पत्र की जांच के लिए, न केवल तभी लागू होता है जब मैं ग्राहक को सत्यापित करना चाहता हूं? अगर मैं अज्ञात क्लाइंट की अनुमति दे रहा हूं, लेकिन सिर्फ स्नीफिंग से बचना चाहता हूं, तो यह आवश्यक नहीं है? – SpacemanScott

+0

(हाँ, यह परीक्षण क्लाइंट के रूप में है, बस पूछ रहा है क्योंकि मुझे अंततः दोनों प्रकारों का समर्थन करने की आवश्यकता होगी) – SpacemanScott

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