Javax.net.ssl.SSLHandshakeException को हल करना: sun.security.validator.ValidatorException: PKIX पथ निर्माण विफल त्रुटि?


Answers

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX पथ निर्माण विफल: sun.security.provider.certpath.SunCertPathBuilderException: अनुरोधित लक्ष्य के वैध प्रमाणीकरण पथ को खोजने में असमर्थ

• जब मुझे त्रुटि मिली, मैंने अभिव्यक्ति के अर्थ को Google से बाहर करने की कोशिश की और मुझे पता चला, यह समस्या तब होती है जब कोई सर्वर अपने HTTPS SSL प्रमाणपत्र को बदलता है, और जावा का हमारा पुराना संस्करण रूट प्रमाणपत्र प्राधिकरण (सीए) को नहीं पहचानता है। ।

• यदि आप अपने ब्राउज़र में HTTPS यूआरएल तक पहुंच सकते हैं तो रूट सीए को पहचानने के लिए जावा को अपडेट करना संभव है।

• अपने ब्राउज़र में, HTTPS URL पर जाएं जो जावा एक्सेस नहीं कर सका। HTTPS प्रमाणपत्र श्रृंखला पर क्लिक करें (इंटरनेट एक्सप्लोरर में लॉक आइकन है), प्रमाणपत्र देखने के लिए लॉक पर क्लिक करें।

• प्रमाण पत्र के "विवरण" पर जाएं और "फ़ाइल में कॉपी करें" पर जाएं। इसे बेस 64 (.cer) प्रारूप में कॉपी करें । यह आपके डेस्कटॉप पर सहेजा जाएगा।

• सभी अलर्ट को अनदेखा कर प्रमाणपत्र स्थापित करें।

• इस प्रकार मैंने यूआरएल की प्रमाण पत्र जानकारी एकत्र की है जिसे मैं एक्सेस करने का प्रयास कर रहा था।

अब मुझे प्रमाण पत्र के बारे में जानने के लिए अपना जावा संस्करण बनाना था ताकि आगे यूआरएल को पहचानने से इनकार न किया जाए। इस संबंध में मुझे यह जिक्र करना चाहिए कि मैंने जॉगल किया है कि मूल प्रमाणपत्र जानकारी जेडीके के \ jre \ lib \ सुरक्षा स्थान में डिफ़ॉल्ट रूप से रहती है, और पहुंच के लिए डिफ़ॉल्ट पासवर्ड है: changeit।

कैकर्ट की जानकारी देखने के लिए निम्न प्रक्रियाएं निम्नलिखित हैं:

• स्टार्ट बटन पर क्लिक करें -> रन

• cmd टाइप करें। कमांड प्रॉम्प्ट खुलता है (आपको इसे व्यवस्थापक के रूप में खोलने की आवश्यकता हो सकती है)।

• अपने Java/jreX/bin निर्देशिका पर जाएं

• निम्नलिखित टाइप करें

keytool -list -keystore डी: \ जावा \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

यह कीस्टोर के भीतर मौजूद मौजूदा प्रमाणपत्रों की सूची देता है। ऐसा कुछ ऐसा दिखता है:

सी: \ दस्तावेज़ और सेटिंग्स \ NeelanjanaG> keytool -list -keystore डी: \ जावा \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

कीस्टोर पासवर्ड दर्ज करें: बदलें

कीस्टोर प्रकार: जेक्स

कीस्टोर प्रदाता: सूर्य

आपके कीस्टोर में 44 प्रविष्टियां हैं

verisignclass3g2ca, 26 मार्च, 2004, विश्वसनीय कर्टेंट्री,

सर्टिफिकेट फिंगरप्रिंट (एमडी 5): ए 2: 33: 9 बी: 4 सी: 74: 78: 73: डी 4: 6 सी: ई 7: सी 1: एफ 3: 8 डी: सीबी: 5 सी: ई 9

entrustclientca, 9 जनवरी, 2003, विश्वसनीयCertEntry,

सर्टिफिकेट फिंगरप्रिंट (एमडी 5): 0 सी: 41: 2 एफ: 13: 5 बी: ए0: 54: एफ 5: 96: 66: 2 डी: 7 ई: सीडी: 0 ई: 03: एफ 4

thawtepersonalbasicca, 13 फरवरी, 1 999, विश्वसनीय कर्टेंट्री,

सर्टिफिकेट फिंगरप्रिंट (एमडी 5): ई 6: 0 बी: डी 2: सी 9: सीए: 2 डी: 88: डीबी: 1 ए: 71: 0 ई: 4 बी: 78: ईबी: 02: 41

addtrustclass1ca, 1 मई, 2006, विश्वसनीयCertEntry,

सर्टिफिकेट फिंगरप्रिंट (एमडी 5): 1 ई: 42: 95: 02: 33: 92: 6 बी: बी 9: 5 एफ: सी 0: 7 एफ: डीए: डी 6: बी 2: 4 बी: एफसी

verisignclass2g3ca, 26 मार्च, 2004, विश्वसनीय कर्टेंट्री,

सर्टिफिकेट फिंगरप्रिंट (एमडी 5): एफ 8: बीई: सी 4: 63: 22: सी 9: ए 8: 46: 74: 8 बी: बी 8: 1 डी: 1 ई: 4 ए: 2 बी: एफ 6

• अब मुझे पहले से स्थापित प्रमाणपत्र को कैकर्ट में शामिल करना था।

• इसके लिए निम्नलिखित प्रक्रिया है:

keytool -import -noprompt -trustcacerts -alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

यदि आप जावा 7 का उपयोग कर रहे हैं:

keytool -importcert -trustcacerts-alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass परिवर्तन

• फिर यह प्रमाणपत्र जानकारी को कैकर फ़ाइल में जोड़ देगा।

यह ऊपर दिया गया अपवाद के लिए मिला समाधान है !!

Question

संपादित करें: - मेरे Blog पर प्रश्न प्रस्तुत करने और अधिक प्रस्तुत करने योग्य तरीके से उत्तर देने का प्रयास किया

मूल मुद्दा यहां दिया गया है: -

मुझे यह त्रुटि मिल रही है

विस्तृत संदेश sun.security.validator.ValidatorException: PKIX पथ निर्माण विफल:
sun.security.provider.certpath.SunCertPathBuilderException: अनुरोधित लक्ष्य के वैध प्रमाणन पथ को खोजने में असमर्थ

कारण javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX पथ निर्माण विफल: sun.security.provider.certpath.SunCertPathBuilderException: अनुरोधित लक्ष्य के लिए वैध प्रमाणीकरण पथ नहीं ढूंढ पा रहा है

मैं टोमकैट 6 का उपयोग वेबसर्वर के रूप में कर रहा हूं। मेरे पास अलग-अलग पोर्टमैट पर अलग-अलग टॉमकैट पर एक ही मशीन पर दो https वेबबैप्लिकेशन स्थापित हैं। App2(port 443) App1(port 8443) और App2(port 443)App2 से App2 । जब App2 i जुड़ता है App2 i त्रुटि मिलती है। मुझे पता है कि यह बहुत आम त्रुटि है इसलिए विभिन्न मंचों और साइटों पर कई समाधानों में आया। मेरे पास दोनों tomcat यानी server.xml . server.xml में प्रविष्टि से नीचे है

keystoreFile="c:/.keystore" 
keystorePass="changeit"

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

विकल्प 1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

विकल्प 2 पर्यावरण चर में नीचे सेट करना

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

विकल्प 3 पर्यावरण परिवर्तनीय में नीचे सेट करना

JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

लेकिन कुछ भी काम नहीं किया

आखिरी काम में क्या जावा दृष्टिकोण को निष्पादित किया गया है जिसमें अपाचे एचटीपी क्लाइंट के साथ अमान्य SSL प्रमाणपत्रों को कैसे प्रबंधित किया जाए? पास्कल थिवेन्ट द्वारा यानी प्रोग्राम इंस्टॉलकर्ट को निष्पादित करना।

लेकिन यह दृष्टिकोण devbox सेटअप के लिए ठीक है लेकिन मैं इसे उत्पादन वातावरण पर उपयोग नहीं कर सकता।

मैं सोच रहा हूं कि ऊपर वर्णित तीन दृष्टिकोण क्यों काम नहीं करते थे जब मैंने app2 सर्वर के server.xml में वही मानों का उल्लेख किया है और सेटिंग द्वारा ट्रस्टस्टोर में समान मान

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

app1 प्रोग्राम में।

अधिक जानकारी के लिए मैं कनेक्शन बना रहा हूं

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

if (conn instanceof HttpsURLConnection) {

  HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();

  conn1.setHostnameVerifier(new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
      return true;
    }
  });

  reply.load(conn1.getInputStream());



मेरी cacerts फ़ाइल पूरी तरह से खाली था। मैंने अपनी विंडोज मशीन (जो ओरेकल जावा 7 का उपयोग कर रहा है) से कैकर्ट्स फ़ाइल की प्रतिलिपि बनाकर इसे हल किया और इसे मेरे लिनक्स बॉक्स (ओपनजेडीके) में स्कैन किया।

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

और फिर लिनक्स मशीन पर

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

यह अब तक बहुत अच्छा काम करता है।




मैंने एक छोटी Win32 (WinXP 32bit testet) बेवकूफ cmd (कमांडलाइन) स्क्रिप्ट लिखी जो प्रोग्राम फ़ाइलों में सभी जावा संस्करणों को ढूंढती है और उन्हें एक प्रमाणपत्र जोड़ती है। पासवर्ड को डिफ़ॉल्ट "परिवर्तन" होना चाहिए या स्क्रिप्ट में इसे स्वयं बदलना चाहिए :-)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause



टॉमकैट के लिए उबंटू सर्वर पर चलने के लिए, यह पता लगाने के लिए कि कौन सा जावा उपयोग किया जा रहा है, "ps -ef | grep tomcat" कमांड का उपयोग करें:

नमूना:

/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat

फिर, हम इसमें जा सकते हैं: cd /usr/local/java/jdk1.7.0_15/jre/lib/security

डिफ़ॉल्ट कैकर्ट फ़ाइल यहां स्थित है। इसमें अविश्वसनीय प्रमाणपत्र डालें।




यह जावा की एक दोष है जो मैकोज़ एक्स में मानक ऑपरेटिंग सिस्टम कीस्टोर का उपयोग नहीं कर रही है। मैंने आज एक परिवर्तन अनुरोध दायर किया है http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8185892





Tags

java java   ssl   https