हल javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX पथ निर्माण विफल?


426

संपादित करें: - प्रश्न को प्रारूपित करने की कोशिश की और मेरा ब्लॉग पर अधिक प्रचलित तरीके से उत्तर स्वीकार किया

यहाँ मूल मुद्दा है।

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

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

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

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

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

हर साइट एक ही कारण कहती है कि app2 द्वारा दिया गया प्रमाणपत्र app1 jvm के विश्वसनीय स्टोर में नहीं है। यह सच भी प्रतीत होता है जब मैंने IE ब्राउज़र में एक ही यूआरएल को हिट करने की कोशिश की, यह काम करता है (वार्मिंग के साथ, इस वेब साइट के सुरक्षा प्रमाण पत्र के साथ एक समस्या है। यहां मैं कहता हूं कि इस वेबसाइट को जारी रखें)। लेकिन जब उसी URL को Java क्लाइंट (मेरे मामले में) द्वारा मारा जाता है, तो मुझे उपरोक्त त्रुटि मिलती है। इसलिए इसे ट्रस्टस्टोर में रखने के लिए मैंने इन तीन विकल्पों की कोशिश की:

विकल्प 1

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

Option2 पर्यावरण चर में नीचे की स्थापना

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

Option3 पर्यावरण चर में नीचे सेटिंग

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

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

आख़िरकार क्या काम किया है अपाचे HttpClient के साथ अवैध एसएसएल प्रमाणपत्रों को संभालने के लिए सुझाए गए जावा दृष्टिकोण को निष्पादित कर रहा है ? पास्कल थिवेंट द्वारा अर्थात प्रोग्राम इंस्टाल्ट को निष्पादित करना।

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

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

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());


ओडली पर्याप्त रूप से क्लस्टर्ड सर्वरों के बीच संचार करते समय मुझे यह त्रुटि मिली कि व्यक्तिगत रूप से एसएसएल की कोई समस्या नहीं थी। एक बार जब मैंने domainnameअपने आरएचईएल सर्वरों में ठीक से सेट किया तो समस्या दूर हो गई। आशा है कि यह किसी की मदद करता है।
डेविड

जांच करने के लिए एक और बात यह है कि आपके पास जावा का नवीनतम संस्करण है - मुझे इसकी वजह से इसी तरह की त्रुटि हो रही थी।
Redzarf

stackoverflow.com/questions/2893819/… - भी प्रासंगिक और एक शानदार जवाब।
सिद्धार्थ

जवाबों:


406

आपको उपयोग की गई JVM की ट्रस्टस्टोर फ़ाइल में App2 के लिए प्रमाणपत्र जोड़ने की आवश्यकता है %JAVA_HOME%\lib\security\cacerts

पहले आप जांच सकते हैं कि आपका प्रमाणपत्र निम्नलिखित कमांड को चलाकर पहले से ही ट्रस्टस्टोर में है: keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"(आपको पासवर्ड प्रदान करने की आवश्यकता नहीं है)

यदि आपका प्रमाणपत्र गायब है, तो आप इसे अपने ब्राउज़र से डाउनलोड करके प्राप्त कर सकते हैं और इसे निम्नलिखित कमांड के साथ ट्रस्टस्टोर में जोड़ सकते हैं:

keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>

आयात करने के बाद आप अपना प्रमाणपत्र जोड़ने के लिए पहले कमांड को फिर से चला सकते हैं।

सन / ओरेकल की जानकारी यहाँ मिल सकती है


6
आपको पूर्ण पथ का उपयोग करना होगा, उदाहरणार्थ c: \ java \ jdk \ lib \ security \ cacerts
शमनीज़ेज़

48
जैसे सिमोनस ने कहा, आपको पासवर्ड की आवश्यकता नहीं है, लेकिन यदि आप इसे चाहते हैं, तो डिफ़ॉल्ट पासवर्ड "परिवर्तन" है।
फेलिक्स

16
साथ ही, विंडोज में आपको टर्मिनल को व्यवस्थापक के रूप में चलाने की आवश्यकता होती है, अन्यथा keytool error: java.io.FileNotFoundException ... (Access is denied)जब आप अपना प्रमाणपत्र आयात करने का प्रयास करते हैं तो आपको त्रुटि मिलती है ।
फेलिक्स

2
अहं @SimonSez तुम मेरे भगवान हो। लेकिन इसे जोड़ने के लिए, किसी को स्टोर स्टोर और पासवर्ड को निर्दिष्ट करना होगा जैसा कि @M Sach ने काम करने के लिए दिया था।
बड्सनकिस

2
जावा 1.8 के साथ मुद्दों को जारी रखा। वर्णित के रूप में प्रमाण पत्र जोड़ने और जावा <1.8 का उपयोग करने की आवश्यकता है
टॉम हावर्ड

180

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

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

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

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

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

• सभी अलर्ट्स को नजरअंदाज करते हुए सर्टिफिकेट इंस्टॉल करें।

• यह है कि मैंने उस URL की प्रमाणपत्र जानकारी एकत्र की जिसे मैं एक्सेस करने का प्रयास कर रहा था।

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

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

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

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

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

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

keytool -list -Stystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ Security / certerts

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

C: \ Documents and Settings \ NeelanjanaG> keytool -list -Stystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

पासवर्ड दर्ज करें: परिवर्तन करें

कीस्टोर प्रकार: jks

Keystore प्रदाता: SUN

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

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

प्रमाणपत्र फिंगरप्रिंट (MD5): A2: 33: 9B: 4C: 74: 78: 73: D4: 6C: E7: C1: F3: 8D: CB: 5C: E9

entrustclientca, 9 जनवरी, 2003, विश्वसनीयसेंट्री,

प्रमाणपत्र फिंगरप्रिंट (MD5): 0C: 41: 2F: 13: 5B: A0: 54: F5: 96: 66: 2D: 7E: CD: 0E: 03: F4

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

प्रमाणपत्र फिंगरप्रिंट (MD5): E6: 0B: D2: C9: CA: 2D: 88: DB: 1A: 71: 0E: 4B: 78: EB: 02: 41

addtrustclass1ca, 1 मई, 2006, विश्वसनीयसेंट्री,

प्रमाणपत्र फिंगरप्रिंट (MD5): 1E: 42: 95: 02: 33: 92: 6B: B9: 5F: C0: 7F: DA: D6: B2: 4B: FC

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

प्रमाणपत्र फिंगरप्रिंट (MD5): F8: BE: C4: 63: 22: C9: A8: 46: 74: 8B: B8: 1D: 1E: 4A: 2B: F6

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

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

keytool –import –noprompt –trustcacerts –alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -Stystore PATH_TO_ACERTS_FILE -storepass PASSWORD

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

keytool –importcert –trustcacerts –alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -Stystore PATH_TO_CACERTS_FILE -storepass बदलाव

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

यह समाधान है जो मैंने ऊपर उल्लिखित अपवाद के लिए पाया है !!


5
जब प्रमाणपत्र समाप्त हो जाता है तो आप क्या करते हैं? सब कुछ (वार्षिक) दोहराएं?
ggkmath

7
क्या इस कार्यक्रम को करने का कोई तरीका है?
मेशुलम सिल्क

1
PKIX त्रुटि से निपटने वाले लोगों के लिए, "पथ किसी भी भरोसेमंद एंकर के साथ श्रृंखला नहीं करता है", इस समाधान ने दुर्भाग्य से मेरे लिए उस समस्या को हल नहीं किया।
इडेडांटे

3
एक प्रश्न - क्या उपनाम नाम वेब पता है जिसके लिए हम प्रमाण पत्र आयात कर रहे हैं? उदाहरण के लिए, यदि URL domain.site.com/pages/service.asmx है, तो alias होना चाहिए domain.site.com या पूरा URL (domain.site.com/pages/service.asmx) या क्या इसे भी http से पहले उपसर्ग किया जाना चाहिए : // या यह सिर्फ एक मनमाना नाम है?
नैनोसॉफ्ट

1
पथ: \ lib \ Security> keytool -import -noprompt -trustcacerts -alias webCert -file webCertResource.cer -keystore c: / उपयोक्ता / जैकी / डेस्कटॉप -स्टोरपरिवर्तित परिवर्तन मुझे "सिस्टम निर्दिष्ट फ़ाइल नहीं मिल रही है"
जेसी

46

टॉमकट 7 में कैसे काम करना है

मैं एक टॉमकैट ऐप में एक स्व-हस्ताक्षरित प्रमाणपत्र का समर्थन करना चाहता था लेकिन निम्नलिखित स्निपेट काम करने में विफल रहा

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground {
    public static void main(String[] args) throws Exception {

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}

यह मेरी समस्या हल हो गई है:

1) .crtफ़ाइल डाउनलोड करें

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • <your domain>अपने डोमेन से बदलें (उदाहरण के लिए jossef.com)

2) .crtफ़ाइल को जावा के cacertsसर्टिफिकेट स्टोर में लागू करें

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • <your domain>अपने डोमेन से बदलें (उदाहरण के लिए jossef.com)
  • <JAVA HOME>अपने जावा होम डायरेक्टरी से बदलें

3) इसे हैक करें

भले ही iv'e ने मेरे प्रमाणपत्र को Javaडिफ़ॉल्ट प्रमाणपत्र स्टोर में स्थापित किया हो, लेकिन टॉमकैट इसे अनदेखा करता है (ऐसा लगता है कि यह जावा के डिफ़ॉल्ट प्रमाणपत्र स्टोर का उपयोग करने के लिए कॉन्फ़िगर नहीं किया गया है)।

इसे हैक करने के लिए, अपने कोड में निम्नलिखित कहीं जोड़ें:

String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...

4
चरण 2 ने स्प्रिंगबूट और टॉमकैट 7 का उपयोग करते हुए मेरे लिए चाल चली। धन्यवाद।
टिम पेरी

क्या मुझे जावा से
कीलेट

@ सात्विक हाँ। आप इसे अपने सिस्टम पर इंस्टॉल किए गए सभी जावा
डायर के

1
यह काम किया! इस तरह के एक उपयोगी उत्तर के लिए एक टन @ जोसेफह्रुश धन्यवाद!
टॉम टेलर

1
मेरे कोड में @Jossef Harush के कोड सेगमेंट को जोड़ने के बाद मेरा मुद्दा हल हो गया था।
चमोड़ पथिराना

10

मेरे मामले में मुद्दा यह था कि वेबसर्वर केवल प्रमाणपत्र और मध्यवर्ती सीए भेज रहा था, रूट सीए नहीं। इस JVM विकल्प को जोड़ने से समस्या हल हो गई:-Dcom.sun.security.enableAIAcaIssuers=true

प्राधिकरण सूचना पहुँच विस्तार के caIssuers पहुँच विधि के लिए समर्थन उपलब्ध है। यह संगतता के लिए डिफ़ॉल्ट रूप से अक्षम है और सिस्टम गुण com.sun.security.enableAIAcaIssuersको मान सत्य में सेट करके सक्षम किया जा सकता है।

यदि यह सही है, तो सन पीकेआईएक्स सर्टिफिकेशन सर्टिफिकेट का उपयोग करता है, तो जारी करने वाले सीए प्रमाणपत्र को खोजने के लिए सर्टिफिकेट के एआईए एक्सटेंशन (सर्टिफिकेट्स के अलावा निर्दिष्ट) में जानकारी का उपयोग करता है, बशर्ते वह प्रकार का एक यूआरआई है ldap, http, या ftp।

स्रोत


यह वास्तव में मेरी समस्या को हल कर दिया, धन्यवाद!
लुइसा सिल्वा

6

दूसरा कारण JDK का पुराना संस्करण हो सकता है। मैं jdk संस्करण 1.8.0_60 का उपयोग कर रहा था, बस नवीनतम संस्करण को अपडेट करने से प्रमाणपत्र समस्या हल हो गई।


2
मुझे भी यही समस्या थी। एक एपीआई एनक्रिप्ट क्रिप्ट सर्टिफिकेट वाला एपीआई कॉल करना जावा के पुराने संस्करणों के साथ काम नहीं कर सकता है क्योंकि यह विश्वसनीय रूट प्रमाणीकरण अधिकारियों द्वारा मान्यता प्राप्त नहीं है। जावा को अपडेट करने से यह समस्या हल हो जाएगी।
hertg

5

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

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

और फिर linux मशीन पर

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

यह अब तक बहुत काम आया है।


1
यह आश्चर्यजनक रूप से काम करता है यदि समस्या यह है कि आप जावा के पुराने संस्करण का उपयोग कर रहे हैं जिसमें नवीनतम प्रमाण पत्र नहीं हैं।
अत्रिपाठी

@atripathi मैक के बारे में कैसे?
iOSAndroidWindowsMobileAppsDev

यदि cacerts फ़ाइल खाली थी, तो आपके जावा इंस्टॉलेशन में कुछ गड़बड़ थी। आपको यह सब पुनः स्थापित करना चाहिए था।
लोर्ने

शायद, लेकिन यह समाधान काम कर गया और बाद में कुछ भी गलत नहीं था।
रयान

5

मेरे लिए, यह त्रुटि एक NGINX रिवर्स प्रॉक्सी के पीछे एक प्रक्रिया से जुड़ने की कोशिश करते समय दिखाई दी, जो एसएसएल को संभाल रही थी।

यह पता चला कि समस्या एक ऐसा प्रमाणपत्र था जिसके बिना पूरी प्रमाण पत्र श्रृंखला संक्षिप्त नहीं थी। जब मैंने मध्यवर्ती सीट्स जोड़े, तो समस्या हल हो गई।

उम्मीद है की यह मदद करेगा।


thats क्या im की तरह लग रहे हो। क्या आप बता सकते हैं कि आपने मध्यवर्ती सीट्स को कैसे और कहाँ जोड़ा है। http का उपयोग करते हुए im प्रॉक्सी को उलटता है न कि NGINX को।
आसफ मगेन

इसने मुझे मेरे मामले में मदद की, जैसे कि httpd: access.redhat.com/solutions/43575
Asaf Magen

Nginx के साथ, यह केवल SSL विन्यास के लिए .key और .pem फ़ाइलों का उपयोग करता है। पहले आप .crt को .pem (साधारणतया: cp yourfile.crt yourfile.pem) में रूपांतरित करें और फिर SSL सर्टिफिकेट श्रृंखला के लिए: आप .pem (cat yourfile.cer >> afile.pem) के अंतिम में .cer फ़ाइल संलग्न करें
Th Anh Nguyễn

5

लिनक्स के तहत टॉमकैट 7 का उपयोग करते हुए, इसने यह चाल चली।

String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

लिनक्स के तहत, $JAVA_HOMEहमेशा सेटअप नहीं होता है, लेकिन आमतौर पर यह /etc/alternatives/jreइंगित करता है$JAVA_HOME/jre


5

नीचे कोड मेरे लिए काम करता है:

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}

HttpsURLConnection conn = null;
            URL url = new URL(serviceUrl);
            conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  

             conn.setSSLSocketFactory(sc.getSocketFactory());

5
यह कोड पूरी तरह असुरक्षित है और इसका उपयोग नहीं किया जाना चाहिए।
लोरेन

@ user207421 यह असुरक्षित क्यों है? संक्षेप में कोड में क्या हो रहा है।
गोविंदा सखारे

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

4

jdk1.8.0_171जब मैं उसी मुद्दे का सामना कर रहा था तब मैं उपयोग कर रहा था । मैंने यहां शीर्ष 2 समाधानों की कोशिश की (कुंजीटूल का उपयोग करके एक प्रमाण पत्र जोड़कर और एक अन्य समाधान जो इसमें एक हैक है) लेकिन वे मेरे लिए काम नहीं करते थे।

मैंने अपने JDK को अपग्रेड 1.8.0_181किया और यह एक आकर्षण की तरह काम किया।


2

मैंने एक छोटी 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

2

नीचे MacOS X के लिए सटीक कमांड मेरे लिए काम की है जहाँ मुझे 'importcert' विकल्प में डबल हाइपेन के साथ प्रयास करना था जो काम करता है:

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit

2

मेरे लिए इस पद से मान्यता प्राप्त समाधान काम नहीं किया: https://stackoverflow.com/a/9619478/4507034

इसके बजाय, मैंने अपनी मशीन विश्वसनीय प्रमाणीकरणों को प्रमाणन आयात करके समस्या को हल करने में कामयाबी हासिल की।

कदम:

  1. उस URL पर जाएं (उदाहरण के लिए https://localhost:8443/yourpath) जहां प्रमाणीकरण काम नहीं कर रहा है।
  2. उल्लिखित पोस्ट में वर्णित प्रमाणीकरण का निर्यात करें।
  3. आपकी विंडोज़ मशीन खुली पर: Manage computer certificates
  4. Trusted Root Certification Authorities-> पर जाएंCertificates
  5. अपनी your_certification_name.cerफ़ाइल यहाँ आयात करें ।

1

टॉमबैट उबंटू सर्वर पर चल रहा है, यह पता लगाने के लिए कि जावा का उपयोग किया जा रहा है, "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.015/jre/lib/security

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


1

सुरक्षा के लिए हमें अपने कार्यान्वयन में स्व हस्ताक्षरित प्रमाण पत्र का उपयोग नहीं करना चाहिए। हालांकि, जब विकास की बात आती है, तो अक्सर हमें परीक्षण वातावरण का उपयोग करना पड़ता है, जिसे स्व-हस्ताक्षरित अनाज मिला। मैंने इस समस्या को अपने कोड में प्रोग्रामेटिक रूप से ठीक करने की कोशिश की और मैं असफल रहा। हालाँकि, jre ट्रस्ट-स्टोर में प्रमाण को जोड़कर मेरे मुद्दे को ठीक कर दिया। कृपया नीचे चरण खोजें,

  1. साइट प्रमाणित डाउनलोड करें,

  2. प्रमाण पत्र की प्रतिलिपि बनाएँ (उदा: cert_file.cer) निर्देशिका में $ JAVA_HOME \ Jre \ Lib सुरक्षा

  3. व्यवस्थापक में CMD खोलें और निर्देशिका को $ JAVA_HOME \ Jre \ Lib \ Security में बदलें

  4. नीचे दिए गए आदेश का उपयोग करके एक ट्रस्ट स्टोर में प्रमाण पत्र आयात करें,

keytool -import -alias ca -file cert_file.cer -keystore cacerts -storepassit

अगर आपको यह कहते हुए कोई त्रुटि हुई है कि केटूल पहचानने योग्य नहीं है तो कृपया इसे देखें।

नीचे हाँ की तरह लिखें

इस प्रमाणपत्र पर भरोसा करें: [हाँ]

  1. अब अपने कोड को चलाने की कोशिश करें या जावा का उपयोग करके प्रोग्राम को URL तक पहुँचाएँ।

अपडेट करें

यदि आपका ऐप सर्वर jboss है तो सिस्टम प्रॉपर्टी के नीचे जोड़ने का प्रयास करें

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

उम्मीद है की यह मदद करेगा!


1

प्रभावी समाधान (अल्पाइन लिनक्स)

हमारे एप्लिकेशन वातावरण में इस समस्या को ठीक करने में सक्षम होने के लिए, हमने निम्न प्रकार से लिनक्स टर्मिनल कमांड तैयार किए हैं:

cd ~

होम डायरेक्टरी में सर्टिफिकेट फ़ाइल जनरेट करेगा।

apk add openssl

यह कमांड अल्पाइन लिनक्स में ओप्सनल स्थापित करता है। आप अन्य लिनक्स वितरण के लिए उचित आदेश पा सकते हैं।

openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

आवश्यक प्रमाणित फ़ाइल जनरेट की गई।

sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt

JRE को प्रोग्राम 'keytool' के साथ लागू किया।

नोट: कृपया अपने DNS को प्रतिस्थापित करें<host-dns-ssl-belongs>

नोट 2: कृपया धीरे से ध्यान दें कि -nopromptसत्यापन संदेश (हाँ / नहीं) -storepass changeitको संकेत नहीं देगा और पैरामीटर पासवर्ड संकेत को अक्षम कर देगा और आवश्यक पासवर्ड प्रदान करेगा (डिफ़ॉल्ट 'परिवर्तन' है)। ये दो गुण आपको अपने स्क्रिप्ट के वातावरण में उन लिपियों का उपयोग करने देंगे जैसे डॉकटर छवि बनाना।

नोट 3 यदि आप अपने ऐप को डोकर के माध्यम से तैनात कर रहे हैं, तो आप गुप्त फ़ाइल को एक बार जनरेट कर सकते हैं और अपने एप्लिकेशन प्रोजेक्ट फ़ाइलों में डाल सकते हैं। आपको इसे बार-बार उत्पन्न करने की आवश्यकता नहीं होगी।


0

मुझे भी यही समस्या है।

मैंने SSL प्रमाणपत्र को .keystore में जोड़कर लगभग सब कुछ करने की कोशिश की, लेकिन, यह Java1_6_x के साथ काम नहीं कर रहा था। मेरे लिए यह मदद करता है अगर हम जावा के नए संस्करण, जावा 1_8_x को जेवीएम के रूप में उपयोग करना शुरू करते हैं।


1
मेरे लिए भी ऐसा। जावा 1.8.0_91 से 1.8.0_121 तक के अपडेट ने समस्या को हल किया। मुझे Apache HTTPClient का उपयोग करके अपवाद मिला।
देवबक

मैं अभी भी इस मुद्दे OAuth2 प्रमाणीकरण का उपयोग किया है
सोफ़िएन

0

जब मैं एक प्रॉक्सी के पीछे हूं तो मुझे एंड्रॉइड स्टूडियो के साथ यह समस्या थी। मैं क्रैशलाईटिक्स का उपयोग कर रहा था जो एक बिल्ड के दौरान मैपिंग फ़ाइल को अपलोड करने की कोशिश करता है।

मैंने गुम हुए प्रॉक्सी प्रमाणपत्र को ट्रस्टस्टोर में स्थित में जोड़ दिया /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

निम्नलिखित आदेश के साथ: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

उदाहरण के लिए डिफ़ॉल्ट ट्रस्टस्टोर पासवर्ड keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt


0

बस एक छोटी सी हैक। URL को https से http तक "hudson.model.UpdateCenter.xml" फाइल में अपडेट करें

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

0

मैं झंकार करना चाहता हूं क्योंकि मेरे पास एक QEMU वातावरण है जहां मुझे जावा में फाइलें डाउनलोड करनी हैं। यह बाहर निकलता है /etc/ssl/certs/java/cacertsक्यूईएमयू में समस्या है क्योंकि यह /etc/ssl/certs/java/cacertsमेजबान वातावरण में मेल नहीं खाता है। मेजबान वातावरण एक कंपनी प्रॉक्सी के पीछे है इसलिए जावा कैचर्ट एक अनुकूलित संस्करण है।

यदि आप QEMU वातावरण का उपयोग कर रहे हैं, तो सुनिश्चित करें कि होस्ट सिस्टम पहले फ़ाइलों तक पहुँच सकता है। उदाहरण के लिए आप अपने होस्ट मशीन पर इस स्क्रिप्ट को पहले देख सकते हैं। यदि स्क्रिप्ट मेजबान मशीन में ठीक चलती है लेकिन QEMU में नहीं है, तो आपको मेरे जैसी ही समस्या हो रही है।

इस समस्या को हल करने के लिए, मुझे QEMU में मूल फ़ाइल का बैकअप बनाना पड़ा, QEMU चेरोट जेल में होस्ट वातावरण में फ़ाइल की प्रतिलिपि बनाएँ, और फिर जावा QEMU में सामान्य रूप से फ़ाइलों को डाउनलोड कर सकता है।

एक बेहतर समाधान /etcQEMU पर्यावरण में माउंट किया जाएगा ; हालांकि मुझे यकीन नहीं है कि इस प्रक्रिया में अन्य फाइलें प्रभावित होंगी। इसलिए मैंने इस बदसूरत लेकिन आसान काम के इर्द-गिर्द इस्तेमाल करने का फैसला किया।


0

यह कुख्यात PKIX त्रुटि संदेश के लिए किसी अन्य संभावित कारण को दस्तावेज़ करने के लिए किसी भी जगह के रूप में अच्छा लगता है। किस्टोर और ट्रस्टस्टोर सामग्री और विभिन्न जावा इंस्टॉलेशन कॉन्फिग को देखने के लिए बहुत लंबा समय बिताने के बाद मुझे एहसास हुआ कि मेरा मुद्दा नीचे था ... एक टाइपो।

टाइपो का मतलब था कि मैं भी कीस्टोर को ट्रस्टस्टोर के रूप में इस्तेमाल कर रहा था। मेरी कंपनियों के रूप में रूट CA को कीस्टोर में एक स्वसंपूर्ण प्रमाण पत्र के रूप में परिभाषित नहीं किया गया था, लेकिन केवल एक प्रमाणित श्रृंखला के हिस्से के रूप में, और कहीं और परिभाषित नहीं किया गया था (यानी कैसर्ट) मैं PKIX त्रुटि प्राप्त करता रहा।

एक असफल रिलीज के बाद (यह ठेस विन्यास है, यह कहीं और ठीक था) और दो दिनों तक सिर खुजाने के बाद मैंने आखिरकार टाइपो देखा, और अब सब अच्छा है।

आशा है कि यह किसी की मदद करता है।


-1

इसे अपने कोड में जोड़ें:

TrustManager[] trustAllCerts = new TrustManager[]{
           new X509TrustManager() {
               @Override
               public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                   return new X509Certificate[0];
               }

               @Override
               public void checkClientTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }

               @Override
               public void checkServerTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }
           }
       };

       try {
           SSLContext sc = SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, new java.security.SecureRandom());
           HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
       } catch (GeneralSecurityException e) {
       }

1
इस साइट पर कोड-ओनली उत्तर आमतौर पर दिए गए हैं। क्या आप अपने जवाब को अपने कोड की कुछ टिप्पणियों या स्पष्टीकरण को शामिल करने के लिए संपादित कर सकते हैं? स्पष्टीकरण में सवालों का जवाब देना चाहिए: यह क्या करता है? इसे यह कैसे करना है? यह कहाँ जाता है? यह ओपी की समस्या को कैसे हल करता है?
मिथाइलियन

1
अपने कोड से जोड़ें नंबर भी नहीं अपने कोड से जोड़ें । इस तरह से SSLContext बनाना उन सभी सुरक्षा जांचों को हटा देता है जो आपके द्वारा कनेक्ट किए जा रहे सर्वर की पहचान को सत्यापित करती हैं। अपनी चाबी खोने की समस्या का जवाब यह नहीं है कि आप अपनी हर चीज से सभी तालों को हटा दें।
एंड्रयू हेनले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.