java - एसएसएल प्रमाणपत्र सर्वर नाम कैसे हल किए गए हैं / क्या मैं keytool का उपयोग कर वैकल्पिक नाम जोड़ सकता हूं?




security ssl (2)

होस्ट नाम सत्यापन कैसे किया जाना चाहिए आरएफसी 6125 में परिभाषित किया गया है, जो कि हाल ही में है और सभी प्रोटोकॉल के लिए अभ्यास सामान्य है, और आरएफसी 2818 को बदलता है, जो एचटीटीपीएस के लिए विशिष्ट था। (मुझे यह भी यकीन नहीं है कि जावा 7 आरएफसी 6125 का उपयोग करता है, जो इसके लिए बहुत हालिया हो सकता है।)

आरएफसी 2818 (धारा 3.1) से :

यदि कोई विषय एटल नाम एक्सटेंशन प्रकार dNSName मौजूद है, तो इसे पहचान के रूप में उपयोग किया जाना चाहिए। अन्यथा, प्रमाण पत्र के विषय क्षेत्र में (सबसे विशिष्ट) सामान्य नाम फ़ील्ड का उपयोग किया जाना चाहिए। हालांकि आम नाम का उपयोग मौजूदा अभ्यास है, लेकिन इसे बहिष्कृत किया गया है और प्रमाणन प्राधिकरणों को इसके बजाय dNSName का उपयोग करने के लिए प्रोत्साहित किया जाता है।

[...]

कुछ मामलों में, यूआरआई को मेजबाननाम के बजाय आईपी पता के रूप में निर्दिष्ट किया जाता है। इस मामले में, iPAddress subjectAltName प्रमाण पत्र में उपस्थित होना चाहिए और यूआरआई में बिल्कुल आईपी से मेल खाना चाहिए।

अनिवार्य रूप से, आपके पास विशिष्ट समस्या इस तथ्य से आती है कि आप अपने सीएन में आईपी पते का उपयोग कर रहे हैं और होस्ट नाम नहीं। कुछ ब्राउज़र काम कर सकते हैं क्योंकि सभी टूल सख्ती से इस विनिर्देश का पालन नहीं करते हैं, विशेष रूप से क्योंकि आरएफसी 2818 में "सबसे विशिष्ट" स्पष्ट रूप से परिभाषित नहीं है (आरएफसी 6215 में चर्चा देखें)।

यदि आप जावा 7 के रूप में -ext san=dns:www.example.com उपयोग कर रहे हैं, तो -ext san=dns:www.example.com में एक विषय वैकल्पिक नाम शामिल करने का विकल्प है ( -ext लिए प्रलेखन में तालिका देखें): आप का उपयोग कर सकते हैं - -ext san=dns:www.example.com या -ext san=ip:10.0.0.1

संपादित करें:

आप openssl.cnf को बदलकर ओपनएसएसएल में एक SAN का अनुरोध कर सकते हैं (यदि आप मुझे याद करते हैं, तो आप वैश्विक कॉन्फ़िगरेशन को संपादित नहीं करना चाहते हैं, तो आप प्रतिलिपि को वर्तमान निर्देशिका में ले लेंगे, या आप OPENSSL_CONF का उपयोग करके एक स्पष्ट स्थान चुन सकते हैं वातावरण विविधता)।

निम्न विकल्पों को सेट करें (पहले ब्रैकेट के भीतर उचित अनुभाग खोजें):

[req]
req_extensions = v3_req

[ v3_req ]
subjectAltName=IP:10.0.0.1
# or subjectAltName=DNS:www.example.com

इसके लिए एक पर्यावरण चर का उपयोग करने के लिए एक अच्छी चाल भी है (बजाय इसे कॉन्फ़िगरेशन फ़ाइल में ठीक करने के बजाय): http://www.crsr.net/Notes/SSL.html

इन्हें स्पष्टता के लिए अलग-अलग प्रश्नों के रूप में phrased किया जा सकता है, लेकिन वे सभी एक ही मुद्दे से संबंधित हैं।

SSL प्रमाणपत्र सर्वर नाम कैसे हल किए गए हैं?

ब्राउज़र सर्टिफिकेट के सीएन फ़ील्ड का उपयोग क्यों करते हैं, लेकिन जावा का तंत्र केवल "विषय वैकल्पिक नाम" को ही देखता है?

क्या keytool का उपयोग कर एसएसएल प्रमाणपत्र में वैकल्पिक नाम जोड़ना संभव है? यदि नहीं, तो ओपनएसएसएल का उपयोग करने के बजाय एक अच्छा विकल्प है ??

बस थोड़ी सी पृष्ठभूमि: मुझे HTTPS का उपयोग करके कई सर्वरों के साथ संवाद करने के लिए एक मुख्य सर्वर प्राप्त करने की आवश्यकता है। जाहिर है, हम प्रत्येक सर्वर के लिए एसएसएल प्रमाण पत्र नहीं खरीदना चाहते हैं (वहां कई हो सकते हैं), इसलिए मैं स्वयं हस्ताक्षरित प्रमाणपत्रों का उपयोग करना चाहता हूं (मैं उन्हें उत्पन्न करने के लिए कीटोल का उपयोग कर रहा हूं)। ओएस में भरोसेमंद प्रमाण पत्र जोड़ने के बाद, ब्राउज़र (आईई और क्रोम) खुशी से विश्वसनीय रूप से कनेक्शन स्वीकार करते हैं। हालांकि, जावा के कैकर्ट में प्रमाण पत्र जोड़ने के बाद भी, जावा अभी भी विश्वसनीय रूप से कनेक्शन स्वीकार नहीं करेगा और निम्न अपवाद फेंकता है:

इसके कारण: java.security.cert.CertificateException: sun.security.util.HostnameChecker.matchIP (HostnameChecker.java:142) पर sun.security.util.HostnameChecker.match (HostnameChecker.java:75) पर कोई विषय वैकल्पिक नाम मौजूद नहीं है। com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity (X509T rustManagerImpl.java6464) com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java5050) पर कॉम पर। sun.net.ssl.internal.ssl.ClientHandshaker.server प्रमाण पत्र (Clien tHandshaker.java:1185) ... 14 और अधिक

मैंने पाया कि मैं अपने स्वयं के HostNameVerifier को लागू करने वाले प्रमाणपत्र को जावा ट्रस्ट कर सकता हूं, जिसे मैंने यहां से कॉपी किया है: com.sun.jbi.internal.security.https.DefaultHostnameVerifier बस परीक्षण करने के लिए (वैसे, होस्टनाम को तर्क के रूप में पारित किया गया HostnameVerifier सही है, इसलिए मुझे लगता है कि इसे स्वीकार किया जाना चाहिए था)।

मैं प्रमाण पत्र फ़ील्ड सीएन का उपयोग होस्टनाम (आमतौर पर आईपी पता) के रूप में कर रहा हूं।

क्या कोई मुझे बता सकता है कि क्या मैं कुछ गलत कर रहा हूं और मुझे सही दिशा में इंगित करता हूं?


एक स्विच स्टेटमेंट में कई मामलों को निष्पादित किया जा सकता है। इसलिए..







java security ssl