"पीकेआईएक्स पथ निर्माण विफल" और "अनुरोधित लक्ष्य के लिए वैध प्रमाणीकरण मार्ग खोजने में असमर्थ"


422

मैं अपने जावा प्रोजेक्ट के लिए twitter4j लाइब्रेरी का उपयोग करके ट्वीट प्राप्त करने की कोशिश कर रहा हूं । मेरी पहली बार चलाने पर मैं प्रमाण पत्र के बारे में त्रुटि मिली है sun.security.validator.ValidatorExceptionऔर sun.security.provider.certpath.SunCertPathBuilderException। फिर मैंने इसके द्वारा ट्विटर प्रमाणपत्र जोड़ा:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

लेकिन सफलता के बिना। यहाँ ट्वीट प्राप्त करने की प्रक्रिया है:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("myConsumerKey")
        .setOAuthConsumerSecret("myConsumerSecret")
        .setOAuthAccessToken("myAccessToken")
        .setOAuthAccessTokenSecret("myAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = twitter.search(query);
        System.out.println("Total amount of tweets: " + result.getTweets().size());
        List<Status> tweets = result.getTweets();

        for (Status tweet : tweets) {
            System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Failed to search tweets: " + te.getMessage());
    }

और यहाँ त्रुटि है:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=d35baff5 or
    http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
    at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
    at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
    ... 5 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

6
नमस्कार कृपया नीचे दिया गया URL देखें। मुझे यकीन है कि ये आपकी मदद करेंगे। java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/... । आपको अपने ssl सर्टिफिकेट को java ट्रस्टस्टोर सर्टिफिकेट (Path: jre / lib / Security / cacerts) में जोड़ना होगा।
sus007 13

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

इस stackoverflow.com/a/9210661/4741746 की कोशिश करें यह आपका जवाब हो सकता है
सुशांत गोसावी

2
मैंने सिर्फ इस जावा कोड का उपयोग किया है और https के लिए पोर्ट को 443 के रूप में निर्दिष्ट करना न भूलें। जावा कोड github.com/escline/InstallCert/blob/master/InstallCert.java पर यह आपकी CACTSTS फ़ाइल लेगा और उन सभी को जोड़ देगा आपके द्वारा दिए गए URL के इनपुट के रूप में वर्तमान प्रमाणपत्र। मेरे मामले में मैंने होस्ट = "mywebservice.uat.xyz.com" के मूल्यों को हार्डकोड किया; पोर्ट = 443; पदबंध = "changeit" .toCharArray (); फिर प्रोग्राम "jssecacerts" नामक एक नई फ़ाइल बनाता है जिसमें सब कुछ होगा। इसे "कैसैर्ट" नाम दें और इसका उपयोग करें। आप सभी सेट हो जाएंगे।
Reddymails

जवाबों:


572
  1. अपने ब्राउज़र में URL पर जाएं:
    • फ़ायरफ़ॉक्स - HTTPS प्रमाणपत्र श्रृंखला (URL पते के ठीक बगल में लॉक आइकन) पर क्लिक करें। क्लिक करें"more info" > "security" > "show certificate" > "details" > "export.." । नाम चुनें और फ़ाइल प्रकार example.cer चुनें
    • क्रोम - एड्रेस बार में एड्रेस के लिए बायीं ओर दिए गए साइट आइकन पर क्लिक करें, "प्रमाणपत्र" -> "विवरण" -> "निर्यात" चुनें और प्रारूप में सहेजें "डेर-एन्कोडेड बाइनरी, एकल प्रमाण पत्र"।
  2. अब आपके पास कीस्टोर के साथ फाइल है और आपको इसे अपने जेवीएम में जोड़ना होगा। कैसर्ट फ़ाइलों का स्थान निर्धारित करें, जैसे। C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. अगली example.cerफ़ाइल को कमांड लाइन में कैसर्ट में आयात करें :

keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer

आपको पासवर्ड के लिए पूछा जाएगा कि कौन सा डिफ़ॉल्ट है changeit

अपने JVM / PC को पुनरारंभ करें।

स्रोत: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html


27
मुझे उद्धरणों में रास्ता निकालना था और इसे डीईआर के बजाय बेस 64 के रूप में भी सहेजना था
थियोडोर के।

3
wow..its chrome के माध्यम से एक जादू की तरह काम किया है आप बस लेफ्ट एड्रेस बार पर लॉक आइकन पर क्लिक करें, और फिर विवरण पर क्लिक करें और कोई पुनः आरंभ करने की आवश्यकता नहीं है
aswzen

8
ध्यान दें कि श्रृंखला में सभी प्रमाणपत्रों के लिए निर्देश दोहराया जाना चाहिए। साथ ही aliasकमांड लाइन में सर्टिफिकेट का नाम यूनिक होना चाहिए।
लू ५५

5
यदि आपका घर एक JDK है, तो यह निर्दिष्ट करना सुनिश्चित करें कि jre उसके भीतर स्थित है: keytool -import -alias उदाहरण -Stystore "C: \ Program Files \ Java \ jdk1.8.0_73 \ jre's lib \ Security \ cacerts" -file example.cer
जैक बेनिम्बल

12
"पहुँच अस्वीकृत" त्रुटि प्राप्त करने वाले किसी के लिए, सुनिश्चित करें कि आप एक व्यवस्थापक के रूप में कमांड प्रॉम्प्ट चला रहे हैं।
वॉकर क्रिस्टी

81

कई घंटों के बाद नए ट्विटर सर्टिफिकेट के साथ अपने जावा 6 इंस्टालेशन को प्राप्त करने के लिए सर्टिफाइड फाइल्स बनाने की कोशिश करने के बाद, मैंने आखिरकार एक मैसेज बोर्ड में एक टिप्पणी में दबे एक अविश्वसनीय रूप से सरल समाधान पर ठोकर खाई। बस जावा 7 इंस्टॉलेशन से कैसर्ट फाइल कॉपी करें और अपने जावा 6 इंस्टॉलेशन में से एक को ओवरराइट करें। संभवत: सबसे पहले कैसर्ट फ़ाइल का बैकअप बनाने के लिए सबसे अच्छा है, लेकिन फिर आप सिर्फ एक और BOOM में कॉपी करें! यह सिर्फ काम करता है।

ध्यान दें कि मैंने वास्तव में एक लिनक्स इंस्टॉलेशन पर एक विंडोज कैसर्ट फाइल को कॉपी किया था और यह ठीक काम किया था।

फ़ाइल में स्थित है jre/lib/security/cacerts पुराने और नए जावा jdk दोनों संस्थापनों में स्थित है।

आशा है कि यह किसी और घंटे की वृद्धि को बचाता है।


4
मैं एक स्व-हस्ताक्षरित प्रमाण पत्र के साथ एक एसएसएल सर्वर का उपयोग करने की कोशिश कर रहा हूं, यह कुंजीटूल का उपयोग करके प्रमाण पत्र जोड़ने की कोशिश की गई है, लेकिन कोई भाग्य नहीं, कोई सुझाव?
ओलेग बेलौसोव

1
खुशी है कि यह काम किया .. लेकिन क्या आप जानते हैं कि मूल कारण क्या था। क्या 6 जावा के साथ विफल करने के लिए बनाया .. और कैसे जावा 7 वर्गों समस्या तय की
विश्वनाथ gowda k

यह किया, हालांकि मैं icedtea 1.6 से oracle 1.7 में चला गया। :)
nperson325681

इस समाधान पर भी विचार करें: stackoverflow.com/questions/33439905/…
Piohen

10
मेरे जैसे जो कभी-कभी स्पष्ट याद करते हैं - सुनिश्चित करें कि आप में जा रहे हैं $JAVA_HOME/jre/lib, नहीं $JAVA_HOME/lib- मैंने उस विस्तार को याद करने में थोड़ा समय बिताया।
रयान हीथकोट

35

मेरा UI दृष्टिकोण:

  1. डाउनलोड कीस्टोर एक्सप्लोरर यहां से
  2. $ JAVA_HOME / jre / lib / सुरक्षा / कैसर्ट खोलें
  3. PW दर्ज करें: परिवर्तन (मैक पर परिवर्तन हो सकता है)
  4. अपनी .crt फ़ाइल आयात करें

अध्यक्ष एवं प्रबंध निदेशक लाइन:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. पीडब्लू में प्रवेश करें: changeit(मैक पर परिवर्तन किया जा सकता है)

1
मैक पर, CMD- लाइन के साथ, कमांड को चलाने के लिए sudo का उपयोग करना चाहिए। # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi

1
विंडोज पर, कमांड विच काम करता है:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
पेट्रीसियो बोनिला

कहाँ से प्रमाणित फ़ाइल प्राप्त करें? मैं नहीं बता सकता कि किस URL को जाना है। jetty.com ?
kraftydevil

मैंने इसे वेब ब्राउज़र से निर्यात करके अपना
सर्टिफिकेट

28

मैंने इस मुद्दे पर ठोकर खाई है, जिसे ठीक करने के लिए कई घंटे का शोध हुआ, विशेष रूप से ऑटो-जेनरेट किए गए प्रमाणपत्रों के साथ, जो आधिकारिक लोगों के विपरीत, काफी मुश्किल हैं और जावा उन्हें उतना पसंद नहीं करता है।

कृपया निम्न लिंक की जाँच करें: जावा में प्रमाण पत्र के साथ समस्या का समाधान करें

मूल रूप से आपको सर्वर से जावा होम सेर्ट्स में प्रमाण पत्र जोड़ना होगा।

  1. अपना प्रमाणपत्र बनाएं या प्राप्त करें और उसे सर्वर में उपयोग करने के लिए Tomcat को कॉन्फ़िगर करें। xml
  2. InstallCertनिम्न स्रोत तर्क प्रदान करते हुए, सर्वर के चलने के दौरान कक्षा के जावा स्रोत कोड को डाउनलोड करें और इसे निष्पादित करेंserver[:port] । कोई पासवर्ड की आवश्यकता नहीं है, क्योंकि मूल पासवर्ड जावा सेर्ट्स ("परिवर्तन") के लिए काम करता है।
  3. प्रोग्राम सर्वर से कनेक्ट होगा और जावा एक अपवाद को फेंक देगा, यह सर्वर द्वारा प्रदान किए गए प्रमाण पत्र का विश्लेषण करेगा और आपको jssecertsनिर्देशिका के अंदर एक फ़ाइल बनाने की अनुमति देगा जहां आपने प्रोग्राम निष्पादित किया है (यदि एक्लिप्स से निष्पादित किया गया है, तो सुनिश्चित करें कि आप कार्य कॉन्फ़िगर करें निर्देशिका में Run -> Configurations)।
  4. उस फ़ाइल को मैन्युअल रूप से कॉपी करें $JAVA_HOME/jre/lib/security

इन चरणों का पालन करने के बाद, प्रमाण पत्र के साथ कनेक्शन अब जावा के भीतर अपवाद उत्पन्न नहीं करेंगे।

निम्न स्रोत कोड महत्वपूर्ण है और यह (सन) ओरेकल ब्लॉगों से गायब हो गया है, एकमात्र पेज जो मैंने पाया है वह प्रदान किए गए लिंक पर था, इसलिए मैं इसे किसी भी संदर्भ के लिए उत्तर में संलग्न कर रहा हूं।

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Originally from:
 * http://blogs.sun.com/andreas/resource/InstallCert.java
 * Use:
 * java InstallCert hostname
 * Example:
 *% java InstallCert ecc.fedora.redhat.com
 */

import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * Class used to add the server's certificate to the KeyStore
 * with your trusted certificates.
 */
public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert [:port] [passphrase]");
            return;
        }

        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP
                    + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();

        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }

        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }

        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));

        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println
                    (" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);

        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();

        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println
                ("Added certificate to keystore 'jssecacerts' using alias '"
                        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;
        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

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

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}

2
नोट की गई फ़ाइल jssecacerts है!
डीनडीपी

मैंने जावा 7 और 8 के लिए इस समाधान का उपयोग करने की कोशिश की। जावा 7 पर चलने के दौरान, मैंने उन सभी दूरस्थ रिपॉजिटरी url के लिए प्रोटोकॉल_version या handshake_failure प्राप्त किया, जिनके साथ मैंने प्रयास किया। SandeepanNath:test sandeepan.nath$ java InstallCert repo1.maven.org:443 Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security/cacerts... Opening connection to repo1.maven.org:443 ... Starting SSL handshake... javax.net.ssl.SSLException: Received fatal alert: protocol_version .. Could not obtain server certificate chain
संदीपन नाथ

20

1. प्रमाण पत्र की जाँच करें

ब्राउज़र में लक्ष्य URL को लोड करने का प्रयास करें और साइट का प्रमाण पत्र देखें (आमतौर पर यह लॉक चिह्न के साथ आइकन द्वारा पहुंच योग्य है। यह ब्राउज़र के पता बार के बाईं या दाईं ओर है) चाहे वह समाप्त हो या अन्य कारण से अविश्वासित हो।

2. JRE और JDK के नवीनतम संस्करण स्थापित करें

नए संस्करण आमतौर पर विश्वसनीय प्रमाण पत्र के अद्यतन सेट के साथ आते हैं।

यदि यह संभव है, तो पुराने संस्करणों की स्थापना रद्द करें। यह ग़लतफ़हमी त्रुटियों को स्पष्ट कर देगा।

3. अपना कॉन्फ़िगरेशन जांचें:

  • जांचें कि आपका JAVA_HOME पर्यावरण चर कहां इंगित करता है।
  • प्रोग्राम को चलाने के लिए आप किस जावा संस्करण का उपयोग करें। इंटेलीज चेक में:
    • फ़ाइल -> परियोजना संरचना ... -> परियोजना सेटिंग्स -> परियोजना -> परियोजना एसडीके:
    • फ़ाइल -> परियोजना संरचना ... -> मंच सेटिंग्स -> एसडीके

4. नए जावा संस्करण से पूरे कीस्टॉर को कॉपी करें

यदि आप नवीनतम उपलब्ध के अलावा JDK के तहत विकसित होते हैं - %JAVA_HOME%/jre/lib/security/cacertsफ़ाइल को नवीनतम स्थापित JRE से नया बदलने की कोशिश करें (पहले एक बैकअप प्रतिलिपि बनाएँ) जैसा कि @ jeremy-goodell उनके उत्तर में बताती है

5. प्रमाण पत्र को अपने किस्टोर में जोड़ें

यदि आपकी समस्या के ऊपर कुछ भी नहीं keytoolहै तो जावा के कीस्टॉर को सर्टिफिकेट बचाने के लिए उपयोग करें:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

प्रमाणपत्र के साथ फाइल को ब्राउज़र से प्राप्त किया जा सकता है क्योंकि @MagGGG उसके उत्तर में सुझाव देता है ।

नोट 1: आपको श्रृंखला में हर प्रमाण पत्र के लिए इसे दोहराने की आवश्यकता हो सकती है। जड़ से शुरू करो।

नोट 2: <alias_name>स्टोर में कुंजियों के बीच अद्वितीय होना चाहिए या keytoolएक त्रुटि दिखाएगा।

आपके द्वारा चलाए जा सकने वाले स्टोर के सभी प्रमाणपत्रों की सूची प्राप्त करने के लिए:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

यदि कुछ गलत हो जाता है, तो इससे आपको स्टोर से प्रमाण पत्र निकालने में मदद मिलेगी:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

यह कितनी अच्छी तरह से विस्तृत है, यह स्वीकृत उत्तर होना चाहिए।
ईगोर हंस

13
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

इसका उपयोग प्रमाण पत्र सत्यापन कूदने के लिए किया जाता है।

चेतावनी केवल इसके लिए विकास के उद्देश्यों के लिए उपयोग असुरक्षित है!


4
इसका उपयोग प्रमाण पत्र के सत्यापन के लिए किया जाता है
गोरम

2
@gorums ग्रहण में इसकी स्थापना कैसे करें?
मालजिसी

6
जब तक आप अपनी मशीन पर मनमाने ढंग से दुर्भावनापूर्ण कोड चलाना नहीं चाहते, तब तक ऐसा न करें। डाउनवोट किया गया है क्योंकि यह किसी भी मशीन को चलाने वाले से समझौता करने का जोखिम रखता है।
ब्रायन

1
सिर्फ इसलिए कि यह 'काम करता है' का मतलब यह नहीं है कि यह सुरक्षित है, आप हर किसी को डाल रहे हैं जो इस सलाह को जोखिम में डालता है। मेरे पतन
विरोधाभास

1
@AceKing बिंदु यह है कि यदि आप प्रमाणपत्र को मान्य नहीं करते हैं तो यह विश्वसनीय कोड नहीं है। उस ने कहा, मुझे लगता है कि यह अभी भी एक उपयोगी उत्तर है। ऐसा करने वाले लोगों को जोखिमों को समझने की जरूरत है।
माइकल जूनियर

12

मेरी स्थिति थोड़ी अलग थी, जब मेरे सिस्टम पर JDK और JRE 1.8.0_112 दोनों मौजूद थे।

मैंने [JDK_FOLDER]\jre\lib\security\cacertsपहले से ज्ञात कमांड का उपयोग करके नए CA प्रमाणपत्रों को आयात किया :

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

फिर भी, मुझे वही PKIX पथ निर्माण विफल रहा

मैंने उपयोग करके java CLI में डिबग जानकारी जोड़ी java -Djavax.net.debug=all ... > debug.logडीबग.लॉग फ़ाइल में, जो लाइन ट्रस्टस्टोर से शुरू होती है, वह है: वास्तव में इसमें पाए जाने वाले कैसर्ट स्टोर की ओर इशारा किया गया है [JRE_FOLDER]\lib\security\cacerts

मेरे मामले में JDK द्वारा उपयोग की गई कैचर्ट फ़ाइल (जिसमें नया CA जोड़ा गया था) की प्रतिलिपि JRE द्वारा उपयोग की गई थी और इस समस्या को ठीक करने के लिए समाधान था।


मैंने सीधे तौर पर आयात किए गए सीट्स जिन्हें मुझे JRE / lib / Security / cacerts में keytool का उपयोग करना चाहिए था, लेकिन इससे मेरे लिए कुछ भी नहीं बदला :( अभी भी वही त्रुटि हो रही है, मैंने उन्हें IDE के माध्यम से, या यहाँ तक कि क्लासपाथ में भी जोड़ा और बीन जोड़ा कीस्टोर स्थान निर्दिष्ट करें! यह पागल वायुसेना है!
एलेक्स

8

मुद्दा पृष्ठभूमि:

जब मैं अपने प्रोजेक्ट में mvan क्लीन इंस्टाल चलाने की कोशिश कर रहा था और Netbeans IDE क्लीन एंड बिल्ड ऑप्शन के माध्यम से मुझे निम्न त्रुटि हो रही थी। जब हम नेट बीन्स आईडीई / कमांड प्रॉम्प्ट के माध्यम से डाउनलोड करते हैं, लेकिन ब्राउज़र के माध्यम से फ़ाइलों को डाउनलोड करने में सक्षम होने के कारण यह समस्या उपलब्ध नहीं होती है।

त्रुटि :

Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  

संकल्प:

1. प्रश्न में Url का प्रमाण पत्र डाउनलोड करें:

  • IE को "व्यवस्थापक के रूप में चलाएं" द्वारा लॉन्च करें (अन्यथा, हम प्रमाण पत्र डाउनलोड नहीं कर पाएंगे)
  • IE-> https: // url / local-repo में url दर्ज करें (मेरे मामले में इस url के पास एक अविश्वसनीय प्रमाण पत्र थायहां छवि विवरण दर्ज करें ।)
  • प्रमाणपत्र त्रुटि -> दृश्य प्रमाण पत्र पर क्लिक करके प्रमाणपत्र डाउनलोड करें
  • विवरण टैब का चयन करें -> फ़ाइल में प्रतिलिपि करें -> अगला -> चुनें "डीईआर एन्कोडेड बाइनरी एक्स 509 (.सीईआर)।
  • प्रमाण पत्र को किसी स्थान पर सहेजें, उदाहरण: c: /user/sheldon/desktop/product.cer
  • बधाई! आपने साइट के लिए प्रमाणपत्र को सफलतापूर्वक डाउनलोड कर लिया है

2. अब समस्या को ठीक करने के लिए कुंजी स्टोर स्थापित करें।

  • मौजूदा प्रमाणपत्र फ़ाइल में डाउनलोड कीस्टोर को जोड़ने के लिए कीटल कमांड को चलाएँ।
  • कमांड: नीचे jdk (JAVA_HOME) के बिन फ़ोल्डर में कमांड

C: \ Program Files \ Java \ jdk1.8.0_141 \ jre \ bin> keytool -importcert -file "C: /user/sheldon/desktop/product.cer" -alier product -keystore "C: / Program Files / Java / जावा jdk1.8.0_141 / JRE / lib / सुरक्षा / cacerts "।

  • आपको पासवर्ड डालने के लिए प्रेरित किया जाएगा। कीस्टोर पासवर्ड दर्ज करें: "इस प्रमाणपत्र पर भरोसा करें" के लिए फिर से "बदलाव" दर्ज करें; [नहीं]: "," हां "दर्ज करें

नमूना कमांड लाइन कमांड / आउटपुट:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • Contgrats! अब आपको अपने नेटबीन्स IDE में "PKIX पथ निर्माण विफल: sun.security.provider.certpath.SunCertPathBuilderException" त्रुटि से छुटकारा मिल जाना चाहिए।

हाय मैंने सभी चरणों का पालन किया लेकिन कोई भाग्य नहीं है :(
मनीषनेगी

क्या आपके पास कैसर्ट के अलावा अन्य कोई प्रमाण पत्र है? यदि आपके पास कुछ और है, तो उसे उस प्रमाण पत्र में जोड़ने का प्रयास करें
बरनी

धन्यवाद @Barani आर, यह मेरी गलती थी कि मैं jre से कमांड निष्पादित कर रहा था और अपने ग्रहण में JDK का उपयोग कर रहा था
ManishNegi

प्रमाणपत्र डाउनलोड करने में सक्षम नहीं था, लेकिन बाद में, "व्यवस्थापक के रूप में चलाएं", अच्छी तरह से काम किया।
एक और कोडर

8

मैं smtp.gmail.com के लिए प्रमाणपत्र आयात करना चाहता था

केवल मेरे लिए काम किया गया समाधान है 1. इस प्रमाणपत्र को देखने के लिए कमांड दर्ज करें

D: \ opensl \ bin \ opensl.exe s_client -connect smtp.gmail.com:465

  1. कॉपी करें और "----- BEGIN CERTIFICATE -----" और "----- END CERTIFICATE -----" के बीच की पंक्तियों को एक फ़ाइल में सहेजें, gmail.cer

  2. Daud

    keytool -import -alias smtp.gmail.com -Stystore "% JAVA_HOME% / jre / lib / Security / cacerts" -file C: \ Users \ Admin \ Desktop \ gmail.cer

  3. पासवर्ड चेजिट दर्ज करें

  4. प्रमाणपत्र आयात करने के लिए हाँ क्लिक करें

  5. जावा को पुनरारंभ करें

अब कमांड चलाते हैं और आप जाने के लिए अच्छे हैं


आपको धन्यवाद! जिससे मेरा दिन बच गया। मेरे मामले में यह एकमात्र उचित समाधान था।
एंड्रयू

मेरा दिन भी बचा लिया। धन्यवाद।
क्रिश

6

यह एक ट्विटर-विशिष्ट उत्तर नहीं है, लेकिन जब आप इस त्रुटि को खोजते हैं तो यह प्रश्न सामने आता है। यदि आपका सिस्टम किसी वेब ब्राउज़र में देखे जाने पर एक मान्य प्रमाणपत्र के साथ दिखाई देने वाली वेबसाइट से कनेक्ट करते समय यह त्रुटि प्राप्त कर रहा है , तो संभवतः इसका मतलब है कि वेबसाइट में एक अधूरा प्रमाणपत्र श्रृंखला है

समस्या के संक्षिप्त सारांश के लिए: प्रमाणपत्र प्राधिकारी किसी भी पुराने प्रमाणपत्र पर हस्ताक्षर करने के लिए अपने रूट प्रमाणपत्र का उपयोग नहीं करते हैं। इसके बजाय, वे (आमतौर पर) मध्यवर्ती पर हस्ताक्षर करते हैं प्रमाणपत्रों करते हैं, जिसमें प्रमाणपत्र प्राधिकारी ध्वज सेट है (अर्थात प्रमाण पत्र पर हस्ताक्षर करने की अनुमति है)। फिर जब आप CA से एक प्रमाण पत्र खरीदते हैं, तो वे आपके CSR को इन मध्यवर्ती प्रमाणपत्रों में से किसी एक पर हस्ताक्षर करते हैं।

आपके जावा ट्रस्ट स्टोर में सबसे अधिक संभावना केवल रूट सर्टिफिकेट की है, इंटरमीडिएट की नहीं।

एक गलत साइट केवल उनके हस्ताक्षरित प्रमाणपत्र को वापस कर सकती है । समस्या: यह एक मध्यवर्ती प्रमाणपत्र के साथ हस्ताक्षरित किया गया था जो आपके ट्रस्ट स्टोर में नहीं है। कैश्ड मध्यवर्ती प्रमाण पत्र डाउनलोड या उपयोग करके ब्राउज़र इस समस्या को संभाल लेंगे; यह वेबसाइट की अनुकूलता को अधिकतम करता है। जावा और OpenSSL जैसे उपकरण, हालांकि, नहीं होगा। और यह प्रश्न में त्रुटि का कारण होगा।

क्वालिस एसएसएल टेस्ट का उपयोग करके आप इस संदेह को सत्यापित कर सकते हैं । यदि आप इसे किसी साइट के विरुद्ध चलाते हैं और यह कहता है

इस सर्वर की सर्टिफिकेट चेन अधूरी है।

तब वह इसकी पुष्टि करता है। आप इसे प्रमाणन पथों को देखकर और पाठ को अतिरिक्त डाउनलोड करके भी देख सकते हैं ।

इसे कैसे ठीक करें: मध्यवर्ती प्रमाणपत्र वापस करने के लिए सर्वर व्यवस्थापक को वेब सर्वर को कॉन्फ़िगर करने की आवश्यकता है। कोमोडो के लिए, उदाहरण के लिए, यह वह जगह है जहां .ca-bundleफ़ाइल काम में आती है। उदाहरण के लिए, mod_ssl के साथ अपाचे कॉन्फ़िगरेशन में, आप SSLCertificateChainFileकॉन्फ़िगरेशन सेटिंग का उपयोग करेंगे । Nginx के लिए, आपको मध्यवर्ती प्रमाणपत्र और हस्ताक्षरित प्रमाण पत्र को संक्षिप्त करने और SSL प्रमाणपत्र कॉन्फ़िगरेशन में उपयोग करने की आवश्यकता है। आप "अधूरी प्रमाण पत्र श्रृंखला" के लिए ऑनलाइन खोज करके अधिक पा सकते हैं।


तुम होशियार हो। धन्यवाद! मेरे जावा सर्वर के नए बिल्डआउट के साथ एक समस्या थी क्योंकि मैं SSLCertificateChainFile के सामने # हटाना भूल गया था !!! वास्तव में अच्छी तरह से समझाया।
किसनार्डऑनलाइन

6

कारण, हमें उपरोक्त त्रुटि यह है कि JDK को बहुत सारे विश्वसनीय प्रमाणपत्र प्राधिकरण (CA) प्रमाणपत्रों के साथ एक फ़ाइल में बांटा गया है, जिसे 'कैसर्ट' कहा जाता है, लेकिन इस फ़ाइल में हमारे स्व-हस्ताक्षरित प्रमाण पत्र का कोई सुराग नहीं है। दूसरे शब्दों में, कैसर्ट फ़ाइल में हमारा स्व-हस्ताक्षरित प्रमाणपत्र आयात नहीं किया गया है और इस प्रकार इसे एक विश्वसनीय इकाई के रूप में नहीं माना जाता है और इसलिए यह उपरोक्त त्रुटि देता है।

उपरोक्त त्रुटि कैसे ठीक करें

उपरोक्त त्रुटि को ठीक करने के लिए, हम सभी को कैचर्ट फ़ाइल में स्व-हस्ताक्षरित प्रमाणपत्र आयात करना होगा।

सबसे पहले, कैसर्ट फ़ाइल का पता लगाएं। हमें जेडीके स्थान का पता लगाना होगा। यदि आप आईडीई में से किसी एक के माध्यम से अपना आवेदन चला रहे हैं जैसे कि एक्लिप्स या इंटेलीज आइडिया परियोजना सेटिंग्स पर जाएं और पता करें कि जेडीके स्थान क्या है। उदाहरण के लिए, एक मैक ओएस पर कैसर्ट फ़ाइल का विशिष्ट स्थान इस स्थान पर होगा / लाइब्रेरी / जावा / JavaVirtualMachines / {{JDK_version}} / सामग्री / होम / jre / lib / सुरक्षा किसी विंडो की मशीन पर यह {{Installation_directory} के तहत होगा } / {{JDK_version}} / JRE / lib / सुरक्षा

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

यदि आपके पास प्रमाणपत्र फ़ाइल (.crt) नहीं है और आपके पास .jks फ़ाइल है, तो आप .crt फ़ाइल को नीचे कमांड का उपयोग करके उत्पन्न कर सकते हैं। यदि आपके पास पहले से .crt / .pem फ़ाइल है तो आप नीचे दिए गए आदेश को अनदेखा कर सकते हैं

## कीस्टोर (.jks फ़ाइल) से प्रमाण पत्र बनाने के लिए ####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

ऊपर दिए गए चरण से selfsign.crt नामक एक फ़ाइल उत्पन्न होगी। अब प्रमाणपत्र को कैसर्ट में आयात करें

अब प्रमाण पत्र को JRE / lib / सुरक्षा / कैसर्ट (भरोसेमंद) में जोड़ें
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

उदाहरण के लिए

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

यह सब, अपने आवेदन को पुनः आरंभ करें और यह ठीक काम करना चाहिए। यदि यह अभी भी काम नहीं करता है और SSL हैंडशेक अपवाद प्राप्त करता है। इसका मतलब है कि आप विभिन्न डोमेन का उपयोग कर रहे हैं तब प्रमाणपत्र में पंजीकृत हैं।

विस्तृत विवरण और स्टेप बाय स्टेप रिज़ॉल्यूशन वाला लिंक यहाँ पर है।


4

जोड़ना cacertsमेरे काम नहीं आया। ध्वज के साथ लॉग को सक्षम करने के बाद -Djavax.net.debug=all, तब जावा पढ़ने से पता चला jssecacerts

आयात करने के लिए jssecacertsअंत में काम किया।


2
यहाँ अनुपलब्ध व्याख्या यह है कि जावा jssecacertsवर्तमान में उपयोग करेगा , अन्यथा cacerts
लोरेन

3

यह एक समाधान है लेकिन इस समस्या के साथ मेरी कहानी के रूप में:

मैं ऊपर दिए गए सभी समाधानों की कोशिश कर रहा लगभग मर चुका था (3 दिनों के लिए) और मेरे लिए कुछ भी काम नहीं किया।

मैंने सारी आशा खो दी।

मैंने इस बारे में अपनी सुरक्षा टीम से संपर्क किया क्योंकि मैं एक प्रॉक्सी के पीछे था और उन्होंने बताया कि उन्होंने हाल ही में अपनी सुरक्षा नीति को अपडेट किया था।

मैंने डेवलपर्स को सूचित नहीं करने के लिए उन्हें बुरी तरह से डांटा।

बाद में उन्होंने एक नई "कैसर्ट" फाइल जारी की जिसमें सभी प्रमाण पत्र शामिल हैं।

मैंने कैसर्ट फ़ाइल को निकाल दिया है जो% JAVA_HOME% / jre / lib / Security के अंदर मौजूद है और इसने मेरी समस्या हल कर दी है।

इसलिए यदि आप इस समस्या का सामना कर रहे हैं तो यह आपकी नेटवर्क टीम से भी हो सकता है।


2

मुझे इस सवाल का सामना करना पड़ा, जबकि उनके अपडेट साइट के माध्यम से ग्रहण में खीरे-ग्रहण प्लगइन को स्थापित करने की कोशिश की गई। मुझे वही SunCertPathBuilderException त्रुटि मिली:

Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    sun.security.validator.ValidatorException: PKIX path building failed: 
   sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

हालांकि इस प्रश्न की दी गई स्थिति के लिए कुछ अन्य उत्तर उपयुक्त और मददगार हैं, फिर भी वे मेरे मुद्दे के लिए अनभिज्ञ और भ्रामक थे।

मेरे मामले में, मुद्दा यह था कि उनकी अद्यतन साइट के लिए प्रदान किया गया URL है:

https://cucumber.io/cucumber-eclipse/update-site

हालाँकि, जब इसे एक ब्राउज़र के माध्यम से नेविगेट किया जाता है, तो इसे (जोड़ा गया " .github ") पर पुनर्निर्देशित किया जाता है :

http://cucumber.github.io/cucumber-eclipse/update-site/

इसलिए संकल्प केवल ग्रहण में अद्यतन साइट को जोड़ने पर अद्यतन साइट URL के पुनर्निर्देशित संस्करण का उपयोग करना है।


3
क्या आप वाकई सही प्रश्न का उत्तर दे रहे हैं? मूल प्रश्न में ककड़ी का कोई उल्लेख नहीं है ...
पूर्ण डेटा समाधान

मुझे लगता है कि मैं हूं। मुझे एक ही SunCertPathBuilderException त्रुटि प्राप्त हुई और एक रिज़ॉल्यूशन की खोज करते समय, इस प्रश्न के साथ-साथ यह भी मिला । हालांकि, उनमें से किसी के पास भी मेरी स्थिति के लिए उचित समाधान नहीं था। मैं उस विशेष प्रश्न का उत्तर देने की कोशिश नहीं कर रहा था कि ग्रहण के लिए ककड़ी-ग्रहण प्लगइन साइट को कैसे जोड़ा जाए। मैं उस मुद्दे (URL पुनर्निर्देशन) का सामना करने के लिए संदर्भ प्रदान करना चाहता था और समझाता हूं कि यह कैसे हल किया गया था।
रोयफ्रेंडली

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

धन्यवाद। चीजों को बहुत स्पष्ट करता है, मेरे डाउनवोट को उलट दिया
डेटा डेटा सॉल्यूशंस

आपका स्वागत है! और इसे फिर से समीक्षा करने के लिए समय निकालने के लिए धन्यवाद।
रॉयफ्रेंडली

2

मैं एक ही मुद्दे का सामना कर रहा था और इसे नीचे दिए गए सरल चरणों का उपयोग करके हल किया गया:

1) Google से InstallCert.java डाउनलोड करें

2) javac InstallCert.java का उपयोग करके इसे संकलित करें

3) इंस्टॉल करें InstallCert.java java InstallCert.java का उपयोग , होस्टनाम और https पोर्ट के साथ, और इनपुट के लिए पूछते समय "1" दबाएं। यह "लोकलहोस्ट" को एक विश्वसनीय कीस्टोर के रूप में जोड़ेगा, और नीचे दिए गए "jssecacerts" नामक एक फ़ाइल उत्पन्न करेगा:

java InstallCert लोकलहोस्ट: 443

4) $ JAVA_HOME / jre / lib / सुरक्षा फ़ोल्डर में jssecacerts की प्रतिलिपि बनाएँ

यहाँ समस्या को हल करने के लिए मुख्य स्रोत है:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html


1

मैंने इस समस्या को जावा सर्वर 8 पर जावा 8 के साथ pkcs12स्टोर से cacertsकीस्टोर पर सर्टिफिकेट आयात करके हल किया ।

: PKCS12 दुकान के लिए पथ
C:\Apps\pkcs12.pfx

जावा cacerts का पथ:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Keytool का पथ:
C:\Program Files\Java\jre1.8.0_151\bin

कमांड प्रॉम्प्ट (व्यवस्थापक के रूप में), आयात प्रमाणपत्र के आदेश से में Keytool साथ फ़ोल्डर में possitioning के बाद pkcs12करने के लिए cacertsके रूप में है इस प्रकार है:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

: आप के लिये कहा जायेगा
1. गंतव्य कुंजीस्टोर पासवर्ड दर्ज (कैसैट्स पैसवर्ड, डिफॉल्ट "चेंजिट" है)
2. सोर्स कीस्टोर पासवर्ड दर्ज करें (pkcs12 पासवर्ड)


प्रभावी होने के लिए परिवर्तन के लिए, सर्वर मशीन को पुनरारंभ करें (या बस जेवीएम को पुनरारंभ करें)।


1
मैं एक मैक पर इस दृष्टिकोण का इस्तेमाल किया और यह सिर्फ काम किया। मेरा सर्टिफिकेट निश्चित रूप से स्वयं हस्ताक्षरित था और मैंने .pfx फ़ाइल को आयात किया था जो मैंने अपने विंडोज़ एडफ़्स सर्वर पर उत्पन्न की थी। मेरे ऐप के लिए जावा 10 का उपयोग करना धन्यवाद
शशिकांत सोनी

0

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


क्या आप मुझे सटीक कॉन्फ़िगरेशन बता सकते हैं जहाँ मैं प्रमाणपत्र स्थापित कर सकता हूँ। Actaully मुझे इस बारे में समस्या हो रही है, मैंने इस मुद्दे के बारे में प्रमाणपत्र स्थापित किया था जिसमें किटूल का उपयोग किया गया था , यह लगभग 20-30 मिनट के लिए काम करता है और फिर सर्वर फिर से वही त्रुटि जारी करता है। क्रिप्या मेरि सहायता करे। मैं 2 दिनों से इस मुद्दे में फंसा हुआ हूं।
दीपक गंगौर

मुझे लगता है कि हर 20-30 मिनट में प्रमाणपत्र बदल जाता है
विश्वनाथ गौड़ा

मैं इसी तरह की समस्या का सामना कर रहा हूं, लेकिन इस मुद्दे के लिए है: मेरे जावा $ $ JAVA_HOME / lib / सुरक्षा / जावा अनुप्रयोगों के कैसर्ट के लिए डिफ़ॉल्ट स्थान, हालांकि मैंने आपूर्ति की है -Djavax.net.ssl.trustStore = / myapp / app .jks कोई भी मेरी मदद कर सकता है इस पर: stackoverflow.com/questions/33821785/…
लक्ष्मण जी

0

मेरे लिए, प्रमाणपत्र त्रुटि पॉप अप हुई क्योंकि मेरे पास पृष्ठभूमि में चलने वाला फ़िडलर था और जो प्रमाणपत्र के साथ गड़बड़ करता है। यह एक प्रॉक्सी के रूप में कार्य करता है जो इतने करीब है और ग्रहण को पुनः आरंभ करता है।


एक ही
संभावना

0

लक्ष्य:

  1. https कनेक्शन का उपयोग करें
  2. एसएसएल चेन को सत्यापित करें
  3. कैकटर के साथ व्यवहार न करें
  4. रनटाइम में प्रमाणपत्र जोड़ें
  5. कैसरट से प्रमाणपत्र न खोएं

यह कैसे करना है:

  1. खुद कीस्टिस्ट को परिभाषित करें
  2. प्रमाणपत्र को कीस्टोर में डालें
  3. हमारे कस्टम वर्ग के साथ SSL डिफ़ॉल्ट संदर्भ को फिर से परिभाषित करें
  4. ???
  5. फायदा

मेरी कीस्टोर आवरण फ़ाइल:

public class CertificateManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private String keyStoreLocation;
    private String keyStorePassword;
    private X509TrustManager myTrustManager;
    private static KeyStore myTrustStore;

    public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
        this.keyStoreLocation = keyStoreLocation;
        this.keyStorePassword = keyStorePassword;
        myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
    }

    public void addCustomCertificate(String certFileName, String certificateAlias)
            throws Exception {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init((KeyStore) null);
        Certificate certificate = myTrustStore.getCertificate(certificateAlias);
        if (certificate == null) {
            logger.info("Certificate not exists");
            addCertificate(certFileName, certificateAlias);
        } else {
            logger.info("Certificate exists");
        }
        tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(myTrustStore);
        for (TrustManager tm : tmf.getTrustManagers()) {
            if (tm instanceof X509TrustManager) {
                setMytrustManager((X509TrustManager) tm);
                logger.info("Trust manager found");
                break;
            }
        }
    }

    private InputStream fullStream(String fname) throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream resource = classLoader.getResourceAsStream(fname);
        try {
            if (resource != null) {
                DataInputStream dis = new DataInputStream(resource);
                byte[] bytes = new byte[dis.available()];
                dis.readFully(bytes);
                return new ByteArrayInputStream(bytes);
            } else {
                logger.info("resource not found");
            }
        } catch (Exception e) {
            logger.error("exception in certificate fetching as resource", e);
        }
        return null;
    }

    public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
        try {
            InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(in, pass.toCharArray());
            logger.info("Keystore was created from resource file");
            return keyStore;
        } catch (Exception e) {
            logger.info("Fail to create keystore from resource file");
        }

        File file = new File(keystore);
        KeyStore keyStore = KeyStore.getInstance("JKS");
        if (file.exists()) {
            keyStore.load(new FileInputStream(file), pass.toCharArray());
            logger.info("Default keystore loaded");
        } else {
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream(file), pass.toCharArray());
            logger.info("New keystore created");
        }
        return keyStore;
    }

    private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
            IOException, KeyStoreException, NoSuchAlgorithmException {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream certStream = fullStream(certFileName);
        Certificate certs = cf.generateCertificate(certStream);
        myTrustStore.setCertificateEntry(certificateAlias, certs);
        FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
        myTrustStore.store(out, getKeyStorePassword().toCharArray());
        out.close();
        logger.info("Certificate pushed");
    }

    public String getKeyStoreLocation() {
        return keyStoreLocation;
    }

    public String getKeyStorePassword() {
        return keyStorePassword;
    }
    public X509TrustManager getMytrustManager() {
        return myTrustManager;
    }
    public void setMytrustManager(X509TrustManager myTrustManager) {
        this.myTrustManager = myTrustManager;
    }
}

यह वर्ग यदि आवश्यक हो तो कीस्टोर का निर्माण करेगा, और इसके अंदर प्रमाण पत्र का प्रबंधन करने में सक्षम होगा। अब एसएसएल संदर्भ के लिए वर्ग:

public class CustomTrustManager implements X509TrustManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private static SSLSocketFactory socketFactory;
    private static CustomTrustManager instance = new CustomTrustManager();
    private static List<CertificateManager> register = new ArrayList<>();

    public static CustomTrustManager getInstance() {
        return instance;
    }

    private X509TrustManager defaultTm;

    public void register(CertificateManager certificateManager) {
        for(CertificateManager manager : register) {
            if(manager == certificateManager) {
                logger.info("Certificate manager already registered");
                return;
            }
        }
        register.add(certificateManager);
        logger.info("New Certificate manager registered");
    }

    private CustomTrustManager() {
        try {
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);

            tmf.init((KeyStore) null);
            boolean found = false;
            for (TrustManager tm : tmf.getTrustManagers()) {
                if (tm instanceof X509TrustManager) {
                    defaultTm = (X509TrustManager) tm;
                    found = true;
                    break;
                }
            }
            if(found) {
                logger.info("Default trust manager found");
            } else {
                logger.warn("Default trust manager was not found");
            }

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{this}, null);
            SSLContext.setDefault(sslContext);
            socketFactory = sslContext.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);


            logger.info("Custom trust manager was set");
        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
            logger.warn("Custom trust manager can't be set");
            e.printStackTrace();
        }
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        List<X509Certificate> out = new ArrayList<>();
        if (defaultTm != null) {
            out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
        }
        int defaultCount = out.size();
        logger.info("Default trust manager contain " + defaultCount + " certficates");
        for(CertificateManager manager : register) {
            X509TrustManager customTrustManager = manager.getMytrustManager();
            X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
            out.addAll(Arrays.asList(issuers));
        }
        logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
        X509Certificate[] arrayOut = new X509Certificate[out.size()];
        return out.toArray(arrayOut);
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        for(CertificateManager certificateManager : register) {
            X509TrustManager customTrustManager = certificateManager.getMytrustManager();
            try {
                customTrustManager.checkServerTrusted(chain, authType);
                logger.info("Certificate chain (server) was aproved by custom trust manager");
                return;
            } catch (Exception e) {
            }
        }
        if (defaultTm != null) {
            defaultTm.checkServerTrusted(chain, authType);
            logger.info("Certificate chain (server) was aproved by default trust manager");
        } else {
            logger.info("Certificate chain (server) was rejected");
            throw new CertificateException("Can't check server trusted certificate.");
        }
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        try {
            if (defaultTm != null) {
                defaultTm.checkClientTrusted(chain, authType);
                logger.info("Certificate chain (client) was aproved by default trust manager");
            } else {
                throw new NullPointerException();
            }
        } catch (Exception e) {
            for(CertificateManager certificateManager : register) {
                X509TrustManager customTrustManager = certificateManager.getMytrustManager();
                try {
                    customTrustManager.checkClientTrusted(chain, authType);
                    logger.info("Certificate chain (client) was aproved by custom trust manager");
                    return;
                } catch (Exception e1) {
                }
            }
            logger.info("Certificate chain (client) was rejected");
            throw new CertificateException("Can't check client trusted certificate.");
        }
    }

    public SSLSocketFactory getSocketFactory() {
        return socketFactory;
    }
}

इस वर्ग को सिंगलटन के रूप में बनाया गया है, क्योंकि केवल एक डिफ़ॉल्टSSL संदर्भ की अनुमति है। तो, अब उपयोग करें:

            CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
            String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
            try {
                certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
            } catch (Exception e) {
                log.error("Can't add custom certificate");
                e.printStackTrace();
            }
            CustomTrustManager.getInstance().register(certificateManager);

संभवतः, यह इस सेटिंग्स के साथ काम नहीं करेगा, क्योंकि मैं संसाधन फ़ोल्डर के अंदर प्रमाण पत्र फ़ाइल रखता हूं, इसलिए मेरा पथ निरपेक्ष नहीं है। लेकिन आम तौर पर, यह पूरी तरह से काम करता है।


1
इस दोहरे दुरुपयोग का available()विशेष रूप से अपने स्वयं के जावदोक के खिलाफ चेतावनी दी जाती है।
लोर्ने

0

यह उत्तर https://stackoverflow.com/a/36427118/1491414 के अतिरिक्त है । धन्यवाद @MagGGG

  • कृपया सुनिश्चित करें कि आपके पास प्रशासक की अनुमति है
  • कृपया कीस्टोर पथ के लिए दोहरे उद्धरण चिह्नों का उपयोग करें (-Stystore C: \ Program Files (x86) \ Java \ jre1.6.0_22 \ lib \ Security \ cacerts ") क्योंकि Windows OS में डिफ़ॉल्ट इंस्टॉल स्थान प्रोग्राम फ़ाइलें होगी और आपको मिलेगा प्रोग्राम फ़ाइलों के बीच स्थान के कारण एक त्रुटि।

0

मैंने इसे नीचे विधि का उपयोग करके तय किया-

  1. Url कॉपी करें जो कनेक्टिंग समस्या हो रही है
  2. Android Studio-> Settings-> Http सेटिंग्स पर जाएं
  3. 'टेस्ट कनेक्शन' में, उस यूआरएल को पेस्ट करें और ओके दबाएं
  4. ओके क्लिक करने पर, एंड्रॉइड स्टूडियो उस यूआरएल के प्रमाण पत्र को आयात करने के लिए कहेगा, इसे आयात करेगा
  5. बस। और कुछ नहीं किया जाना है और मेरा मुद्दा चला गया था। स्टूडियो को भी पुनरारंभ करने की आवश्यकता नहीं है।

0

जब आपके पास एटलसियन सॉफ्टवेयर पूर्व के साथ त्रुटि है। jira

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user 'jira@xyz.pl' via protocol 'imaps, caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

आप इसे विश्वसनीय किस्टोर में जोड़ सकते हैं (उचित प्रमाणपत्र नाम में अनुपलब्ध_का नाम बदलें):

keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts

यदि पासवर्ड डाला changeitऔर पुष्टि के लिए कहा जाएy

इसके बाद बस जीरा को रीस्टार्ट करें।


0

अपने भंडार URL भी HTTP पर काम करते हैं और सुरक्षा चिंता का विषय नहीं है, तो आप के लिए जा सकते settings.xml (अक्सर, लेकिन हमेशा नहीं, में स्थित %USERPROFILE%/.m2) और HTTP साथ HTTPS की जगह के लिए <repository>और <pluginRepository>यूआरएल।

उदाहरण के लिए, यह:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

इसे इसके द्वारा प्रतिस्थापित किया जाना चाहिए:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

0

मैं Arg पास कर JRE के बजाय अपने ट्रस्ट स्टोर का उपयोग कर रहा था -Djavax.net.ssl.trustStore=

मुझे यह त्रुटि विश्वास की परवाह किए बिना certs में मिल रही थी। मेरे लिए मुद्दा आर्ग लाइन पर पारित संपत्तियों के आदेश का था। जब मैं डाल दिया -Djavax.net.ssl.trustStore=और -Djavax.net.ssl.trustStorePassword= पहले -Dspring.config.location= और -jarआर्ग मैं सफलतापूर्वक करने में सक्षम था https पर मेरे बाकी कॉल आह्वान।


0

यदि आप CloudFoundry का उपयोग कर रहे हैं और प्रमाणपत्र समस्या में चल रहे हैं, तो आपको यह सुनिश्चित करना होगा कि आप फिर से प्रमाणपत्र के साथ कीस्टोर-सर्विस के साथ जार को धक्का दें। बस unbind, बाँध और पुनरारंभ काम नहीं करेगा।


0

यदि आपका होस्ट फ़ायरवॉल / प्रॉक्सी के पीछे बैठता है , तो cmd में निम्न कमांड का उपयोग करें:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

बदलें <proxy_hostname>और <proxy_port>HTTP प्रॉक्सी सर्वर से कॉन्फ़िगर किया गया है। बदलने के<remote_host_name:remote_ssl_port>दूरस्थ होस्ट (मूल रूप से url) में से एक के साथ और प्रमाणीकरण समस्या वाले पोर्ट।

अंतिम प्रमाण पत्र की सामग्री को मुद्रित करें और उसे कॉपी करें (शुरू और अंत प्रमाण पत्र की प्रतिलिपि भी)। इसे टेक्स्ट फाइल में पेस्ट करें और इसे .crt एक्सटेंशन दें। अब इस प्रमाणपत्र को java keytool कमांड का उपयोग करके कैसर्ट में आयात करें और इसे काम करना चाहिए।

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit


0

यदि आप इस समस्या को किसी लिनक्स कंटेनर में देख रहे हैं जब जावा एप्लिकेशन किसी अन्य एप्लिकेशन / साइट के साथ संवाद करने की कोशिश कर रहा है, तो यह इसलिए है क्योंकि प्रमाणपत्र को लोड बैलेंसर में गलत तरीके से आयात किया गया है। प्रमाण पत्र आयात करने के लिए चरणों का अनुक्रम है और अगर सही तरीके से नहीं किया गया है, तो आप मुद्दों को देखेंगे

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
certification path to requested target

एक बार जब सीरेट्स को सही तरीके से आयात किया जाता है, तो इसे किया जाना चाहिए। किसी भी JDK सेर्ट्स के साथ टिंकर करने की आवश्यकता नहीं है।


0

मैंने इसे Intellij Idea के लिए हल किया। मुझे इस समस्या का सामना करना पड़ रहा है, मैं समस्या का समाधान करने के लिए बहुत सारी जगह बदल देता हूं। मुझे मेरे लिए एक समाधान मिला। अपने प्रोजेक्ट पर क्लिक करें, आपको Maven दिखाई देगा , उसके बाद जेनरेट सोर्स एंड अपडेटर्स और ReImport दबाएं। यहां छवि विवरण दर्ज करें

हो गया है।


0

मैं एक ही मुद्दे का सामना कर रहा था, मैं 8.1.0-3 का उपयोग कर रहा था, लेकिन बाद में मैंने 9.2.1-0 का उपयोग किया और यह मुद्दा बिना किसी मैनुअल चरणों के तय किया गया था। स्व-हस्ताक्षरित प्रमाण पत्र ने ठीक काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.