अनुरोधित लक्ष्य के लिए मान्य प्रमाणीकरण पथ खोजने में असमर्थ - प्रमाणित आयात के बाद भी त्रुटि


205

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

जब मैं सर्वर पर पोस्ट करने की कोशिश करता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है:

अनुरोध लक्ष्य को वैध प्रमाण पत्र पथ को खोजने में असमर्थ

इस मुद्दे पर कुछ शोध करने के बाद, मैंने निम्नलिखित कार्य किया।

  1. root.cerफ़ाइल के रूप में मेरे सर्वर डोमेन नाम को सहेजा ।
  2. मेरे ग्लासफ़िश सर्वर के JRE में, मैंने इसे चलाया:
    keytool -import -alias example -keystore cacerts -file root.cer
  3. यह प्रमाणित करने के लिए कि प्रमाणपत्र को मेरे कैसर्ट में सफलतापूर्वक जोड़ा गया था, मैंने यह किया:
    keytool -list -v -keystore cacerts
    मैं देख सकता हूँ कि प्रमाणपत्र मौजूद है।
  4. मैंने फिर ग्लासफिश को फिर से शुरू किया और 'पोस्ट' को रिटायर कर दिया।

मुझे अभी भी त्रुटि मिल रही है।

मुझे इस बात का अहसास है क्योंकि मेरी ग्लासफिश वास्तव में उस कैचर फाइल को नहीं पढ़ रही है जिसे मैंने संशोधित किया है, लेकिन शायद कुछ और।

क्या आप में से किसी के पास यह मुद्दा था और मुझे सही दिशा में धकेल सकता है?


1
बस स्पष्ट करने के लिए "मेरे पास एक जावा क्लाइंट है जो एक सर्वर पर स्व-हस्ताक्षरित प्रमाण पत्र के साथ पहुंचने की कोशिश कर रहा है।": आप ग्राहक-प्रमाणपत्र का उपयोग करने की बात कर रहे हैं जो स्वयं-हस्ताक्षरित हैं, क्या आप नहीं हैं? क्या ग्लासफ़िश (विशेष रूप से स्टोर की विश्वास सेटिंग्स) पर आपकी कनेक्टर सेटिंग्स के लिए कोई विशिष्ट कॉन्फ़िगरेशन है?
ब्रूनो

"मेरे पास एक जावा क्लाइंट है जो स्वयं-हस्ताक्षरित प्रमाण पत्र के साथ एक सर्वर तक पहुंचने की कोशिश कर रहा है।": आप ग्राहक-प्रमाणपत्रों का उपयोग करने की बात कर रहे हैं जो स्वयं-हस्ताक्षरित हैं, क्या आप नहीं हैं? - हाँ।
theCoder 13

1
मैंने ग्लासफिश JVM: -jjaxax.net.ssl.keyStore = $ {com.sun.aas.instanceRoot} /config/keystore.jks और -Djavax.net.ssl.trustStore = $ {com.sun में 2 सेटिंग्स पाई हैं। aas.instanceRoot} /config/cacerts.jks। मुझे अब उनमें से किसी एक को प्रमाणित करके जोड़ना होगा। क्या आप इसकी पुष्टि कर सकते हैं कि मैं इसे जोड़ने वाली कस्तूरी है?
theCoder

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

वह ब्रूनो काम करता था। मैंने इसे अपने ग्लासफिश ट्रस्टस्टोर में जोड़ा। आपकी मदद के लिए बहुत बहुत धन्यवाद। आप भी डिर्क।
14

जवाबों:


155

दुर्भाग्य से - यह कई चीजें हो सकती हैं - और बहुत सारे ऐप सर्वर और अन्य जावा 'रैपर' गुणों से खेलने के लिए प्रवृत्त होते हैं और उनके 'अपने' कीचेन पर होते हैं और क्या नहीं। तो यह कुछ अलग तरह से देख सकता है।

ट्रस-इंग की शॉर्ट - मैं कोशिश करूँगा:

java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=trustStore ...

यह देखने के लिए कि क्या मदद मिलती है। 'सभी' के बजाय, यह 'ssl', मुख्य प्रबंधक और विश्वास प्रबंधक को भी सेट कर सकता है - जो आपके मामले में मदद कर सकता है। इसे 'सहायता' पर सेट करने से अधिकांश प्लेटफार्मों पर नीचे की तरह कुछ सूचीबद्ध हो जाएगा।

भले ही - यह सुनिश्चित करें कि आप कीस्टोर (जिसमें आपके पास निजी कुंजी है और आपके साथ अपनी पहचान साबित करते हैं) और ट्रस्ट स्टोर (जो आप पर भरोसा करते हैं) को निर्धारित करता है - और इस तथ्य की अपनी पहचान भी पूरी तरह से समझते हैं। जड़ के लिए विश्वास की एक 'श्रृंखला' है - जो किसी भी श्रृंखला से अलग है एक जड़ के लिए आपको यह पता लगाने की आवश्यकता है कि 'आप' किस पर भरोसा करते हैं।

all            turn on all debugging
ssl            turn on ssl debugging

The   following can be used with ssl:
    record       enable per-record tracing
    handshake    print each handshake message
    keygen       print key generation data
    session      print session activity
    defaultctx   print default SSL initialization
    sslctx       print SSLContext tracing
    sessioncache print session cache tracing
    keymanager   print key manager tracing
    trustmanager print trust manager tracing
    pluggability print pluggability tracing

    handshake debugging can be widened with:
    data         hex dump of each handshake message
    verbose      verbose handshake message printing

    record debugging can be widened with:
    plaintext    hex dump of record plaintext
    packet       print raw SSL/TLS packets

स्रोत: # देखें http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug


6
आपका बहुत बहुत धन्यवाद! -Djavax.net.ssl.trustStore = / location_of / TrustStore ने मेरी समस्या को हल किया और डिबग जानकारी वास्तव में बहुत उपयोगी थी।
RHE

5
java -Djavax.net.debug = all -Djavax.net.ssl.trustStore = TrustStore ... नीचे की त्रुटि देता है: त्रुटि: मुख्य वर्ग को ढूँढ या लोड नहीं कर सका ...
rohith

1
बेशक आपको ट्रस्टस्टोर के पासवर्ड के साथ निर्दिष्ट करने की आवश्यकता हो सकती है -Djavax.net.ssl.trustStorePassword = changeit
user1754036

18

यहाँ समाधान है, नीचे दिए गए लिंक का अनुसरण करें चरण दर चरण:

http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

जावा फ़ाइल: जो ब्लॉग से गायब है

/*
 * 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.
 */



import java.io.*;
import java.net.URL;

import java.security.*;
import java.security.cert.*;

import javax.net.ssl.*;

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 <host>[: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);
    }
    }

}

3
इस समाधान ने मेरे लिए काम किया, लेकिन इसे निजी वर्ग में एक छोटे से बदलाव की जरूरत है SaveTrustManager:public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
रिचर्ड

1
@ रिचर्ड, @ पॉल, @ user6258309 मुझे त्रुटि "थ्रेड" मुख्य "java.net.SocketTimeoutException में अपवाद मिला: पढ़ें java.net पर बाहर रखी गई। ) मैं इसे कैसे ठीक कर सकता हूं
Renjith Krishnan

5
यह 'ऐसा है; जुलाब' मौलिक रूप से असुरक्षित है। प्रयोग नहीं करें।
लोर्ने का

9
यह उत्तर ज्यादातर कोड है। यह व्याख्या नहीं करता है कि यह क्यों या क्यों नहीं काम करता है।

13

आपको JSSE सिस्टम प्रॉपर्टीज़ को कॉन्फ़िगर करने की आवश्यकता है, विशेष रूप से क्लाइंट सर्टिफिकेट स्टोर की ओर।

वाया कमांड लाइन:

java -Djavax.net.ssl.trustStore=truststores/client.ts com.progress.Client

या जावा कोड के माध्यम से:

import java.util.Properties;
    ...
    Properties systemProps = System.getProperties();
    systemProps.put("javax.net.ssl.keyStorePassword","passwordForKeystore");
    systemProps.put("javax.net.ssl.keyStore","pathToKeystore.ks");
    systemProps.put("javax.net.ssl.trustStore", "pathToTruststore.ts");
    systemProps.put("javax.net.ssl.trustStorePassword","passwordForTrustStore");
    System.setProperties(systemProps);
    ...

RedHat साइट पर अधिक जानकारी के लिए देखें ।


स्प्रिंग बूट, स्प्रिंग क्लाउड माइक्रोसर्विस, और स्व-हस्ताक्षरित एसएसएल प्रमाणपत्र के साथ भी यही समस्या थी। मैं application.properties में keyStore और keyStorePassword सेट करने में सक्षम था और इसे बॉक्स से बाहर की तरह काम करने के लिए प्राप्त कर सकता था, लेकिन TrustStore और TrustStorePassword के साथ ऐसा करने में असफल रहा। इस जवाब ने मेरे लिए ट्रस्ट स्टोर के लिए काम किया।
मेट Mइमोविक्स

7

( मेरी अन्य प्रतिक्रिया से रिपॉस्ट ) आयात और (और विश्वास! ) आवश्यक प्रमाणपत्रों के लिए जावा सॉफ्टवेयर वितरण से क्ली
यूटिलिटी कीटल का उपयोग करें

नमूना:

  1. क्ली परिवर्तन से जिर \ बिन तक

  2. कीस्टोर (jre \ bin डायरेक्टरी में मिली फाइल) की
    -टूल-लिस्ट-कीस्टॉर की जाँच करें .. \ lib \ security \ cacerts
    पासवर्ड चेंज है

  3. डाउनलोड और आवश्यक सर्वर से श्रृंखला में सभी प्रमाण पत्र को बचाने के।

  4. प्रमाणपत्र जोड़ें ("रीड-ओनली" एट्रिब्यूट ऑन फाइल ".. \ lib \ Security \ cacerts" हटाने की आवश्यकता है), चलाएं: कीटूल-कलस REPLACE_TO_ANY_UNIQ_NAME -import -keystore "\ lib \ security \ cacerts -file" r: \ root.crt "

गलती से मुझे इतना आसान टिप मिल गया। अन्य समाधानों में InstallCert.Java और JDK के उपयोग की आवश्यकता है

स्रोत: http://www.java-samples.com/showtutorial.php?tutorialid=210


6

मुझे sbt के साथ भी यही समस्या थी
इसने ssl पर repo1.maven.org से निर्भरता लाने की कोशिश की,
लेकिन कहा कि यह "अनुरोधित url के लिए वैध प्रमाणीकरण मार्ग खोजने में असमर्थ है"।
इसलिए मैंने इस पोस्ट का अनुसरण किया और अभी भी एक कनेक्शन को सत्यापित करने में विफल रहा।
इसलिए मैंने इसके बारे में पढ़ा और पाया कि रूट
सर्टिफिकेट पर्याप्त नहीं है, जैसा कि पोस्ट द्वारा सुझाया गया है, इसलिए - मेरे लिए काम करने वाली चीज किस्टोर में इंटरमीडिएट सीए प्रमाण पत्र आयात कर रही थी
मैंने वास्तव में श्रृंखला में सभी प्रमाण पत्र जोड़े और यह एक आकर्षण की तरह काम करता था।


4

JDK 8 से JDK 10 की ओर जाते समय समाधान

JDK 10

root@c339504909345:/opt/jdk-minimal/jre/lib/security #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 80 entries

JDK 8

root@c39596768075:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 151 entries

ठीक करने के उपाय

  • मैंने JDK 10 प्रमाणपत्र को हटा दिया और इसे JDK 8 से बदल दिया
  • जब से मैं डॉकर इमेज बना रहा हूं, मैं जल्दी से मल्टी-स्टेज बिल्ड का उपयोग कर सकता हूं
    • मैं का उपयोग कर एक न्यूनतम JRE निर्माण कर रहा हूँ jlinkके रूप में/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...

तो, यहां अलग-अलग रास्ते हैं और आज्ञाओं का क्रम ...

# Java 8
COPY --from=marcellodesales-springboot-builder-jdk8 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts /etc/ssl/certs/java/cacerts

# Java 10
RUN rm -f /opt/jdk-minimal/jre/lib/security/cacerts
RUN ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts

2

मैं www.udemy.com (रीस्ट जावा वेब सर्विसेज) पर REST वेब सेवाओं के लिए एक ट्यूटोरियल पर काम कर रहा हूं। ट्यूटोरियल में उदाहरण में कहा गया है कि एसएसएल रखने के लिए, मेरे पास मेरे ग्रहण "क्लाइंट" प्रोजेक्ट में "ट्रस्ट_स्टोर" नामक एक फ़ोल्डर होना चाहिए जिसमें एक "कुंजी स्टोर" फ़ाइल होनी चाहिए (हमारे पास सेवा को कॉल करने के लिए "क्लाइंट" प्रोजेक्ट था , और "सेवा" परियोजना जिसमें REST वेब सेवा शामिल थी - एक ही कार्यक्षेत्र में 2 परियोजनाएँ, एक ग्राहक, दूसरी सेवा)। चीजों को सरल रखने के लिए, उन्होंने ग्लासफ़िश ऐप सर्वर से "keystore.jks" को कॉपी करने के लिए कहा (ग्लासफ़िश \ डोमेन \ domain1 \ config \ keystore.jks) जिसका हम उपयोग कर रहे हैं और इसे इस "ट्रस्ट_स्टोर" फ़ोल्डर में डाल दिया है, जो उन्होंने मुझे बनाया था। ग्राहक परियोजना। यह समझ में आता है: सर्वर में स्व-हस्ताक्षरित सेर्ट्स ' s key_store क्लाइंट ट्रस्ट_स्टोर में सीट्स के अनुरूप होगा। अब, यह करते हुए, मुझे यह त्रुटि मिल रही थी कि मूल पोस्ट में उल्लेख है। मैंने इसे गुगुल किया है और पढ़ा है कि क्लाइंट को एक विश्वसनीय / हस्ताक्षरित प्रमाण पत्र नहीं होने के कारण "keystore.jks" फ़ाइल के कारण है, जो यह प्रमाण पत्र पाता है कि वह स्व-हस्ताक्षरित है।

चीजों को स्पष्ट रखने के लिए, मुझे कहना चाहिए कि जैसा कि मैं समझता हूं, "कीस्टॉर.जक्स" में स्व-हस्ताक्षरित सीरट्स होते हैं, और "कैकटर.जक्स" फ़ाइल में सीए सीट्स (सीए द्वारा हस्ताक्षरित) होते हैं। "कीस्टोर.जक्स" "कीस्टोर" है और "कैसटर्स.जक्स" "ट्रस्ट स्टोर" है। जैसा कि "ब्रूनो", एक टिप्पणीकार, ऊपर कहता है, "keystore.jks" स्थानीय है, और "cacerts.jks" दूरस्थ ग्राहकों के लिए है।

तो, मैंने खुद से कहा, हे, ग्लासफिश के पास "cacerts.jks" फाइल भी है, जो ग्लासफिश की ट्रस्ट_स्टोर फाइल है। cacerts.jsk में CA प्रमाणपत्र शामिल हैं। और जाहिरा तौर पर मुझे एक मुख्य स्टोर फ़ाइल में मेरे Trust_store फ़ोल्डर की आवश्यकता है जिसमें कम से कम एक CA प्रमाणपत्र है। इसलिए, मैंने अपने ग्राहक प्रोजेक्ट पर "Trust_store" फ़ोल्डर में "cacerts.jks" फ़ाइल डालने की कोशिश की, और "कीस्टॉर .jks" के बजाय "cacerts.jks" को इंगित करने के लिए VM गुणों को बदल दिया। उस त्रुटि से छुटकारा मिल गया। मुझे लगता है कि काम करने के लिए सीए की जरूरत थी।

यह उत्पादन के लिए आदर्श नहीं हो सकता है, या यहां तक ​​कि विकास के लिए भी कुछ काम करने से परे हो सकता है। उदाहरण के लिए, आप शायद क्लाइंट में "keystore.jks" फ़ाइल में CA certs जोड़ने के लिए "keytool" कमांड का उपयोग कर सकते हैं। लेकिन वैसे भी उम्मीद है कि यह कम से कम संभावित परिदृश्यों को कम कर देता है जो त्रुटि का कारण बनने के लिए यहां हो सकता है।

ALSO: क्लाइंट के लिए मेरा दृष्टिकोण उपयोगी लग रहा था (सर्वर सर्टिफिकेट क्लाइंट ट्रस्ट_स्टोर में जोड़ा गया), ऐसा लगता है कि मूल पोस्ट को हल करने के लिए उपरोक्त टिप्पणियां सर्वर के लिए उपयोगी हैं (क्लाइंट सर्टिफिकेट सर्वर ट्रस्ट_स्टोर में जोड़ा गया है)। चीयर्स।

ग्रहण परियोजना सेटअप:

  • MyClientProject
  • src
  • परीक्षा
  • JRE सिस्टम लाइब्रेरी
  • ...
  • Trust_store
    --- cacerts.jks --- keystore.jks

MyClientProject.java फ़ाइल से स्निपेट:

static {
  // Setup the trustStore location and password
  System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
  // comment out below line
  System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
  System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
  //System.setProperty("javax.net.debug", "all");

  // for localhost testing only
  javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
        public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
          return hostname.equals("localhost");
        }

  });
}

1

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


1

मेरे मामले में मुझे समस्या का सामना करना पड़ रहा था क्योंकि मेरी टॉमकैट प्रक्रिया में विशिष्ट कीस्टोर का उपयोग करके दिया गया था

-Djavax.net.ssl.trustStore=/pathtosomeselfsignedstore/truststore.jks

व्हेयर I सर्टिफिकेट को JRE / lib / सुरक्षा के कैचर को आयात कर रहा था और परिवर्तन प्रतिबिंबित नहीं कर रहे थे। तब मैंने नीचे कमांड किया था जहां /tmp/cert1.test में लक्ष्य सर्वर का प्रमाण पत्र होता है

keytool -import -trustcacerts -keystore /pathtosomeselfsignedstore/truststore.jks -storepass password123 -noprompt -alias rapidssl-myserver -file /tmp/cert1.test

प्रमाणपत्र आयात सफल होने पर हम दोबारा जांच कर सकते हैं

keytool -list -v -keystore /pathtosomeselfsignedstore/truststore.jks

और देखें कि क्या आपका टैग सर्वर उर्फ ​​रैपिड्सस्ल-मायसर के खिलाफ पाया गया है


0

जाँच करें कि क्या फ़ाइल $JAVA_HOME/lib/security/cacertsमौजूद है! मेरे मामले में यह एक फ़ाइल नहीं थी, बल्कि एक लिंक /etc/ssl/certs/java/cacertsभी थी और यह स्वयं (WHAT ???) की भी एक कड़ी थी, इस कारण JVM फ़ाइल को खोज नहीं सकती थी।

समाधान: असली कैसर्ट फ़ाइल की प्रतिलिपि बनाएँ ( आप इसे दूसरे JDK से कर सकते हैं ) /etc/ssl/certs/java/निर्देशिका में और यह आपकी समस्या को हल कर देगा :)


वास्तव में JDK एक लिंक रखता है और शायद पुराने APIs, SDKs के साथ संगतता के लिए ... मैं सफलतापूर्वक ऐसा ही करने में कामयाब रहा ... मैं JDK 8 से JDK 10 तक जा रहा हूं और Docker का उपयोग कर रहा हूं, इसलिए मुझे सिर्फ कैसर्ट से कॉपी करने की आवश्यकता है दूसरे के लिए छवि ... मैंने लिंक और उसी सटीक तरीके से बनाया ...rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
मार्सेलो डे सेल्स

-9

यदि आप pom.xml में $ {JAVA_HOME} जैसे classpath चर का उपयोग कर रहे हैं तो बताएं।

<target>
                    <property name="compile_classpath" refid="maven.compile.classpath"/>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <property name="test_classpath" refid="maven.test.classpath"/>
                    <property name="plugin_classpath" refid="maven.plugin.classpath"/>
                    <property name="jaxb-api.jar" value="${maven.dependency.javax.xml.bind.jaxb-api.jar.path}"/>
                    <property name="project_home" value="${PROJECT_HOME}"/>
                    <property name="java_home" value="${JAVA_HOME}"/>
                    <property name="ant_home" value="${ANT_HOME}"/>
                    <property name="common_home" value="${COMMON_HOME}"/>
                    <property name="JAXP_HOME" value="${common_home}/lib"/>
                    <property name="ejfw_home" value="${PROJECT_HOME}/lib"/>
                    <property name="weblogic_home" value="${WL_HOME}"/>
                    <property name="fw_home" value="${FW_HOME}"/>
                    <property name="env" value="${BUILDENV}"/>
                    <property name="tokenfile" value="${BUILDENV}${BUILDENV_S2S}.properties"/>

लक्ष्यों पर, क्लासपैथ चर जोड़ें। यानी .., -DANT_HOME, -DJAVA_HOME

clean install -e -DPROJECT_HOME=..... -DANT_HOME=C:\bea1036\modules\org.apache.ant_1.7.1 -DJAVA_HOME=C:\bea1036\jdk160_31

1
क्लास के रास्तों और प्रमाणपत्रों का एक-दूसरे से कोई लेना-देना नहीं है।
लोर्ने

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