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


250

मेरे पास एक वर्ग है जो एक फ़ाइल को https सर्वर से डाउनलोड करेगा । जब मैं इसे चलाता हूं, तो यह बहुत सारी त्रुटियाँ देता है। ऐसा लगता है कि मुझे अपने प्रमाण पत्र के साथ समस्या है। क्या क्लाइंट-सर्वर प्रमाणीकरण को अनदेखा करना संभव है? यदि हां, तो कैसे?

package com.da;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.concurrent.Future;

import org.apache.http.HttpResponse;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.client.HttpAsyncClient;
import org.apache.http.nio.client.methods.AsyncCharConsumer;
import org.apache.http.nio.client.methods.HttpAsyncGet;
import org.apache.http.nio.client.methods.HttpAsyncPost;

public class RSDDownloadFile {
    static FileOutputStream fos;

    public void DownloadFile(String URI, String Request) throws Exception
    {
        java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
                "Lang=EN&AuthToken=package", null);
        System.out.println("URI Query: " + uri.toString());

        HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
        httpclient.start();
        try {
            Future<Boolean> future = httpclient.execute(
                    new HttpAsyncGet(uri),
                    new ResponseCallback(), null);

            Boolean result = future.get();
            if (result != null && result.booleanValue()) {
                System.out.println("\nRequest successfully executed");
            } else {
                System.out.println("Request failed");
            }              
        } 
        catch(Exception e){
            System.out.println("[DownloadFile] Exception: " + e.getMessage());
        }
        finally {
            System.out.println("Shutting down");
            httpclient.shutdown();
        }
        System.out.println("Done");  

    }

    static class ResponseCallback extends AsyncCharConsumer<Boolean> {

        @Override
        protected void onResponseReceived(final HttpResponse response) {
             System.out.println("Response: " + response.getStatusLine());
             System.out.println("Header: " + response.toString());
             try {   
                 //if(response.getStatusLine().getStatusCode()==200)
                     fos = new FileOutputStream( "Response.html" );
             }catch(Exception e){
                 System.out.println("[onResponseReceived] Exception: " + e.getMessage());
             }
        }

        @Override
        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
            try
            {
                while (buf.hasRemaining()) 
                {
                    //System.out.print(buf.get());
                    fos.write(buf.get());
                }
            }catch(Exception e)
            {
                System.out.println("[onCharReceived] Exception: " + e.getMessage());
            }
        }

        @Override
        protected void onCleanup() {
            try
            {             
                if(fos!=null)
                    fos.close();
            }catch(Exception e){
                System.out.println("[onCleanup] Exception: " + e.getMessage());         
            }
             System.out.println("onCleanup()");
        }

        @Override
        protected Boolean buildResult() {
            return Boolean.TRUE;
        }

    }
}

त्रुटियाँ:

URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
    at javax.net.ssl.SSLEngine.wrap(Unknown Source)
    at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:154)
    at org.apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.java:276)
    at org.apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.java:79)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:161)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:335)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:275)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:542)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
    at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:180)
    ... 9 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 com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
    ... 16 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)
    ... 21 more
onCleanup()

[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done

2
एक बार मुझे यह त्रुटि मिली और हमारी सुरक्षा टीम से संपर्क किया, और यह पता चला कि मुझे JAR को पैच करना था जो हम उपयोग कर रहे थे, क्योंकि हमारी टीम कंपनी द्वारा प्रदान की गई एक पुरानी का उपयोग कर रही थी। किसी अन्य व्यक्ति के लिए बस एक FYI करें जो समान स्थिति में हो।
kayleeFrye_onDeck

जवाबों:


215

समस्या तब दिखाई देती है जब आपके सर्वर के पास स्व हस्ताक्षरित प्रमाण पत्र होता है। इसे हल करने के लिए आप इस प्रमाणपत्र को अपने JVM के विश्वसनीय प्रमाणपत्रों की सूची में जोड़ सकते हैं।

इस लेख में लेखक का वर्णन है कि अपने ब्राउज़र से प्रमाणपत्र कैसे प्राप्त करें और इसे अपने जेवीएम की कैसर्ट फ़ाइल में जोड़ें। आप या तो JAVA_HOME/jre/lib/security/cacertsफ़ाइल को संपादित कर सकते हैं या आपको -Djavax.net.ssl.trustStoreपैरामीटर के साथ आवेदन चला सकते हैं । सत्यापित करें कि आप किस JDK / JRE का उपयोग कर रहे हैं क्योंकि यह अक्सर भ्रम का स्रोत होता है।

यह भी देखें: एसएसएल सर्टिफिकेट सर्वर नाम कैसे हल किए जाते हैं / क्या मैं कुंजीटूल का उपयोग करके वैकल्पिक नाम जोड़ सकता हूं? यदि आप java.security.cert.CertificateException: No name matching localhost foundअपवाद में चलते हैं।


3
यह मेरे लिए काम नहीं किया है। मेरे पास रूट और चेन सर्टिफिकेट स्थापित है, लेकिन टॉमकैट -7 अभी भी वैधता की रिपोर्ट करता है, जो "डिबेट के लिए वैध प्रमाणीकरण मार्ग खोजने में असमर्थ है" इसको डीबग करने का कोई तरीका है?
चेरुविम

समस्या किसी ऐसे व्यक्ति द्वारा हस्ताक्षरित प्रमाणपत्र के साथ भी दिखाई देती है जिस पर भरोसा नहीं किया जाता है।
लोर्न

महान! यह काम करता हैं! बस यह मत भूलो कि आपके पास jre और jdk दोनों हो सकते हैं, और उनके दोनों cacertsको अपडेट किया जाना चाहिए
Dima Fomin

मेरे मामले में, रूट CA था, लेकिन अगला CA नीचे नहीं था। अगले सीए को जोड़कर चाल चली - धन्यवाद।
जावा-आदी ३०१

1
मेरे मामले में, मैं Netbeans + Apache Tomcat (एकीकृत) का उपयोग कर रहा हूं, इसलिए, Jdk / jre (C: \ Program Files \ Java \ jdk1.8.0.1152 \ jre \ lib) पर विश्वास स्टोर "कैसैटर" में .cer को जोड़ना। सुरक्षा) और Jre (C: \ Program Files \ Java \ jre1.8.0_91 \ lib \ Security) मेरे लिए काम करता है
Jnn

149

यहाँ क्या macOS पर मेरे लिए मज़बूती से काम करता है। Example.com और 443 को उस वास्तविक होस्टनाम और पोर्ट से बदलना सुनिश्चित करें जिसे आप कनेक्ट करने का प्रयास कर रहे हैं, और एक कस्टम उपनाम प्रदान करते हैं। पहला कमांड दूरस्थ सर्वर से प्रदान किए गए प्रमाण पत्र को डाउनलोड करता है और इसे स्थानीय रूप से x509 प्रारूप में बचाता है। दूसरी कमांड जावा के एसएसएल ट्रस्ट स्टोर में सहेजे गए प्रमाण पत्र को लोड करती है।

openssl x509 -in <(openssl s_client -connect example.com:443 -prexit 2>/dev/null) -out ~/example.crt
sudo keytool -importcert -file ~/example.crt -alias example -keystore $(/usr/libexec/java_home)/jre/lib/security/cacerts -storepass changeit

3
मेरे लिए काम करता है क्यों? आपको एक स्पष्टीकरण प्रदान करने की आवश्यकता है।
लोर्न

opensl x509 -in <(खुलता है s_client -connect example.com:443 -prexit 2> / dev / null) -out ~ / example.crt - what is example.crt in कमांड मेरे पास एक .pem प्रमाणपत्र है जिसे मुझे देने की आवश्यकता है। वह यह है ??
विष्णु रंगनाथन

3
.crt और .pem समान फ़ाइल प्रारूप के लिए आमतौर पर फ़ाइल एक्सटेंशन का उपयोग किया जाता है। यदि आपके पास पहले से ही फ़ाइल है, तो बस दूसरी कमांड चलाएं और इसे -file तर्क में पास करें।
गाबे मार्टिन-डेमपसी

1
उत्तम सामग्री। केवल एक चीज है: मुझे किसी कारणवश नवीनतम ओपनसेल 1.0.Xx का उपयोग करना पड़ा, पुराना 9.X.Xx काम नहीं कर रहा था।
zbstof

1
यह SNI समापन बिंदु के साथ काम नहीं करता है। उस स्थिति के लिए आपको जोड़ने की आवश्यकता है: -servername example.com प्रमाणपत्र लाने के दौरान
पेट्रिक बेक

46

मेरे पास सीडेंटेक से वैध हस्ताक्षरित वाइल्डकार्ड प्रमाण पत्र के साथ एक ही मुद्दा था।

सबसे पहले अपना जावा एप्लिकेशन चलाने की कोशिश करें -Djavax.net.debug = SSL देखने के लिए कि वास्तव में क्या चल रहा है।

मैंने इंटरमीडिएट प्रमाणपत्र आयात करना समाप्त कर दिया, जिससे प्रमाणित श्रृंखला टूट गई।

मैंने सहानुभूति से लापता मध्यवर्ती प्रमाण पत्र डाउनलोड किया (आप ssl हैंडशेक लॉग में गुम प्रमाण पत्र के डाउनलोड लिंक देख सकते हैं: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer मेरे मामले में)।

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

keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer

यह था मामला:
किस्ना

2
भ्रम से बचने के लिए, लॉग में रिमोट "सर्टिफिकेट चेन" देखने के लिए डिबग पैरामीटर के साथ जावा (या jcurl) चलाएं, फिर ट्रस्टस्ट्रोर में "CN" को स्पष्ट रूप से पारित कर दिया (डिफ़ॉल्ट के बजाय) निम्नानुसार, यदि मौजूद नहीं है, तो आपको जोड़ने की आवश्यकता है। ssllabs.com/ssltest/analyze.html दिखाएगा कि क्या सर्वर साइड सेर्ट्स में अपूर्ण श्रृंखला है, और इसमें मध्यवर्ती प्रमाणन पथ प्रमाणपत्र शामिल हैं जिन्हें जोड़ने की आवश्यकता है। -Djavax.net.debug=ssl,handshake -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStore=our-client-certs -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStore=their-server-certs
किशना

और, बेशक, एसएसएल मुद्दों को डीबग करने के लिए आधिकारिक लेख: docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/… blogs.oracle.com/java-platform-gatform-entry/…
किशना

मेरे पास एक ही मुद्दा था, यह बहुत उपयोगी है, लेकिन मेरे मामले में आपको केवल सर्वर सर्टिफिकेट को JDK संस्करण की कैसर्ट फ़ाइल में जोड़ना था
पिगिट्रिया

कृपया ध्यान रखें कि पोर्टेकल नामक एक और टूल है जो कैसर्ट फाइल (सर्टिफिकेट स्टोर) खोल सकता है और आसानी से सर्टिफिकेट आयात कर सकता है। बस बाद में कैसर्ट फ़ाइल को सहेजना याद रखें।
--२४

41
  1. फ़ायरफ़ॉक्स का उपयोग करके एसएसएल प्रमाणपत्र निर्यात करें। आप इसे ब्राउज़र में URL मारकर निर्यात कर सकते हैं और फिर प्रमाणपत्र निर्यात करने के विकल्प का चयन कर सकते हैं। मान लेते हैं कि सर्टिफिकेट फ़ाइल का नाम your.ssl.server.name.crt है
  2. अपने JRE_HOME/binया के पास जाओJDK/JRE/bin
  3. कमांड टाइप करें
  4. keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
  5. अपनी जावा प्रक्रिया को पुनरारंभ करें

13
यदि पासवर्ड के लिए कहा जाता है, तो डिफ़ॉल्ट कैसर्ट कीस्टोर पासवर्ड changeit( stackoverflow.com/a/22782035/130484 ) का उपयोग करें। Cmd को व्यवस्थापक के रूप में भी चलाना सुनिश्चित करें।
Fr4nz

22

@ गबे मार्टिन-डेम्पसी के जवाब से मुझे मदद मिली। और मैंने इससे संबंधित एक छोटी स्क्रिप्ट लिखी। उपयोग बहुत सरल है।

होस्ट से प्रमाणपत्र स्थापित करें:

> sudo ./java-cert-importer.sh example.com

पहले से स्थापित प्रमाणपत्र को निकालें।

> sudo ./java-cert-importer.sh example.com --delete

java-cert-importer.sh

#!/usr/bin/env bash

# Exit on error
set -e

# Ensure script is running as root
if [ "$EUID" -ne 0 ]
  then echo "WARN: Please run as root (sudo)"
  exit 1
fi

# Check required commands
command -v openssl >/dev/null 2>&1 || { echo "Required command 'openssl' not installed. Aborting." >&2; exit 1; }
command -v keytool >/dev/null 2>&1 || { echo "Required command 'keytool' not installed. Aborting." >&2; exit 1; }

# Get command line args
host=$1; port=${2:-443}; deleteCmd=${3:-${2}}

# Check host argument
if [ ! ${host} ]; then
cat << EOF
Please enter required parameter(s)

usage:  ./java-cert-importer.sh <host> [ <port> | default=443 ] [ -d | --delete ]

EOF
exit 1
fi;

if [ "$JAVA_HOME" ]; then
    javahome=${JAVA_HOME}
elif [[ "$OSTYPE" == "linux-gnu" ]]; then # Linux
    javahome=$(readlink -f $(which java) | sed "s:bin/java::")
elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OS X
    javahome="$(/usr/libexec/java_home)/jre"
fi

if [ ! "$javahome" ]; then
    echo "WARN: Java home cannot be found."
    exit 1
elif [ ! -d "$javahome" ]; then
    echo "WARN: Detected Java home does not exists: $javahome"
    exit 1
fi

echo "Detected Java Home: $javahome"

# Set cacerts file path
cacertspath=${javahome}/lib/security/cacerts
cacertsbackup="${cacertspath}.$$.backup"

if ( [ "$deleteCmd" == "-d" ] || [ "$deleteCmd" == "--delete" ] ); then
    sudo keytool -delete -alias ${host} -keystore ${cacertspath} -storepass changeit
    echo "Certificate is deleted for ${host}"
    exit 0
fi

# Get host info from user
#read -p "Enter server host (E.g. example.com) : " host
#read -p "Enter server port (Default 443) : " port

# create temp file
tmpfile="/tmp/${host}.$$.crt"

# Create java cacerts backup file
cp ${cacertspath} ${cacertsbackup}

echo "Java CaCerts Backup: ${cacertsbackup}"

# Get certificate from speficied host
openssl x509 -in <(openssl s_client -connect ${host}:${port} -prexit 2>/dev/null) -out ${tmpfile}

# Import certificate into java cacerts file
sudo keytool -importcert -file ${tmpfile} -alias ${host} -keystore ${cacertspath} -storepass changeit

# Remove temp certificate file
rm ${tmpfile}

# Check certificate alias name (same with host) that imported successfully
result=$(keytool -list -v -keystore ${cacertspath} -storepass changeit | grep "Alias name: ${host}")

# Show results to user
if [ "$result" ]; then
    echo "Success: Certificate is imported to java cacerts for ${host}";
else
    echo "Error: Something went wrong";
fi;

निर्दोष रूप से काम करता है। अच्छा काम! । यह इस प्रकार काम करता है: अपनी एसएसएल सेवा शुरू करें (यदि इसकी नहीं चल रही है), और कमांड को निष्पादित करें जैसा कि समझाया गया है (जैसे ./java-cert-importer.sh example.com 1234)। बस।
लेप

1
बहुत अच्छा काम करता है। मुझे Jenkins सर्वर पर बाहरी API से जुड़ने में त्रुटि हो रही थी जो उसके प्रमाणपत्र को बदल देता है और मेरे बिल्ड को विफल कर देता है। यह मेरे मुद्दे को हल करता है
user9869932

ओरेकल को पहली बार में ऐसा कुछ प्रदान करना चाहिए था या कभी भी हर व्यक्ति ने अपना भयानक एसएसएल समाधान नहीं बनाया था। एसएसएल सर्टिफिकेट हैंडलिंग एक ऑपरेटिंग सिस्टम का काम होना चाहिए।
वोल्फगैंग फाहल

17

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

JSSE का उपयोग करके होस्ट से SSL कनेक्शन खोलने का प्रयास करते समय। आमतौर पर इसका मतलब यह है कि सर्वर एक प्रसिद्ध व्यावसायिक प्रमाणन प्राधिकरण जैसे कि Verisign या GoDaddy से प्रमाण पत्र के बजाय परीक्षण प्रमाणपत्र (संभवतः keytool का उपयोग करके उत्पन्न) का उपयोग कर रहा है। वेब ब्राउज़र इस मामले में चेतावनी संवाद प्रदर्शित करते हैं, लेकिन चूंकि JSSE एक इंटरैक्टिव उपयोगकर्ता नहीं मान सकता है, इसलिए यह केवल डिफ़ॉल्ट रूप से एक अपवाद फेंकता है।

प्रमाणपत्र सत्यापन SSL सुरक्षा का एक बहुत महत्वपूर्ण हिस्सा है, लेकिन मैं विवरणों को समझाने के लिए यह प्रविष्टि नहीं लिख रहा हूं। यदि आप रुचि रखते हैं, तो आप विकिपीडिया ब्लर्ब को पढ़कर शुरू कर सकते हैं। यदि आप वास्तव में चाहते हैं, तो मैं इस प्रविष्टि को परीक्षण प्रमाण पत्र के साथ उस होस्ट से बात करने का एक सरल तरीका दिखाने के लिए लिख रहा हूं।

मूल रूप से, आप अपने विश्वसनीय प्रमाणपत्रों के साथ सर्वर के प्रमाणपत्र को KeyStore में जोड़ना चाहते हैं

वहां दिए गए कोड को आज़माएं। यह मदद कर सकता है।


5
"प्रमाणपत्र सत्यापन के बारे में हिस्सा एसएसएल सुरक्षा का एक बहुत महत्वपूर्ण हिस्सा है" जरूरी नहीं कि सच हो। एसएसएल आपको दो आश्वासन देता है: (1) कि आपका संचार निजी है, और (2) जो आप एक सर्वर से बात कर रहे हैं जो एनएसए के लिए जाना जाता है। (:-) कभी-कभी आप केवल बातचीत की गोपनीयता के बारे में परवाह करते हैं, और फिर ए। स्व-हस्ताक्षरित प्रमाणीकरण ठीक है। सामाजिक-biz.org/2011/10/16/the-anti-ssl-consp षड़यंत्र
AgilePro

@AgilePro एसएसएल आपको चार आश्वासन देता है : प्रमाणीकरण, गोपनीयता, अखंडता, और प्राधिकरण का अधिकार। यह आपको कोई आश्वासन नहीं देता है कि आप एनएसए के लिए ज्ञात सर्वर से बात कर रहे हैं। प्रमाणीकरण के बिना केवल गोपनीयता की परवाह करना शब्दों में विरोधाभास है।
लोर्न

@ ईजेपी इस बात से सहमत है कि यदि आप क्लाइंट प्रमाणपत्र का उपयोग करते हैं तो आप प्रमाणीकरण प्राप्त कर सकते हैं और मैं प्राधिकरण की संभावना को मान सकता हूं ... लेकिन अधिकांश उपयोग ग्राहक प्रमाणपत्र के साथ नहीं होते हैं। आप "स्व-हस्ताक्षरित" प्रमाणपत्र और हस्ताक्षरकर्ता प्राधिकरण से प्रमाणपत्र के बीच अंतर को क्या कहेंगे? क्या हस्ताक्षर प्राधिकरण "अखंडता" देता है। एनएसए के बारे में मेरा मजाक यह है कि सभी हस्ताक्षर करने वाले अधिकारी सकारात्मक रूप से हर चीज से स्वतंत्रता की गारंटी नहीं दे सकते। ऐसा नहीं है कि वास्तव में पागल है, लेकिन मुद्दा यह है कि आपका प्रमाण पत्र केवल गुप्त है क्योंकि हस्ताक्षर प्राधिकारी इसे बना सकते हैं। स्व-हस्ताक्षरित अधिक गुप्त हो सकता है।
AgilePro

@AgilePro सर्वर प्रमाणपत्र का उपयोग कर सर्वर को प्रमाणित करता है, और SSL सुरक्षित बनाने के लिए आवश्यक है, जैसा कि RFC 2246 में उल्लेख किया गया है। प्रमाणपत्र बिल्कुल गुप्त नहीं हैं: इसलिए आपकी शेष टिप्पणी का कोई मतलब नहीं है।
लोर्ने

6

इससे मेरी समस्या हल हो गई,

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

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX पथ निर्माण विफल: sun.security.provider.certpath.SunCertpathBuilderException: अनुरोधित लक्ष्य के लिए मान्य प्रमाणन पथ खोजने में असमर्थ
        sun.security.ssl.Alerts.getSSLException (Alerts.java:192) पर
        sun.security.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java.1920) पर
        sun.security.ssl.Handshaker.fatalSE (हैंडशेक.जवा 302) पर

SSLPOKE एक उपकरण है जहाँ आप अपने स्थानीय मशीन से https कनेक्टिविटी का परीक्षण कर सकते हैं।

कनेक्टिविटी का परीक्षण करने की कमान:

"%JAVA_HOME%/bin/java" SSLPoke <hostname> 443
    sun.security.validator.ValidatorException: PKIX पथ निर्माण विफल: 
    sun.security.provider.certpath.SunCertPathBuilderException: अनुरोधित लक्ष्य के लिए मान्य प्रमाणन पथ खोजने में असमर्थ
        at sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java3/3)
        at sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java.292)
        sun.security.validator.Validator.validate (Validator.java:260) पर
        sun.security.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:324) पर
        sun.security.ssl.X509TrustManagerImpl.checkTrusted (X509TrustManagerImpl.java:229) पर
        sun.security.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:124)
        sun.security.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1496) पर
        sun.security.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:216) पर
        sun.security.ssl.Handshaker.processLoop पर (हैंडशकर.जावा: 1026)
        sun.security.ssl.Handshaker.process_record (हैंडशकर। java:961) पर
        sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:1062) पर
        sun.security.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1375) पर
        sun.security.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.java:747) पर
        sun.security.ssl.AppOutputStream.write (AppOutputStream.java:123) पर
        sun.security.ssl.AppOutputStream.write (AppOutputStream.java.138) पर
        SSLPoke.main (SSLPoke.java:31)
    इसके कारण: sun.security.provider.certpath.SunCertPathBuilderException: मान्य प्रमाणन पथ खोजने में असमर्थ 
    अनुरोध किया गया लक्ष्य
        sun.security.provider.certpath.SunCertPathBuilder.build (SunCertPathBuilder.java:141) पर
        sun.security.provider.certpath.SunCertPathBuilder.engineBuild (SunCertPathBuilder.java:126) पर
        java.security.cert.CertPathBuilder.build (CertPathBuilder.java2/2) पर
        sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java.384) पर
        ... 15 और
keytool -import -alias <anyname> -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file <cert path>

यह पहले "कीस्टोर पासवर्ड दर्ज करें:" changeitडिफ़ॉल्ट पासवर्ड होगा। और अंत में एक संकेत "इस प्रमाणपत्र पर भरोसा करें? [नहीं]:", किस्टोर के लिए प्रमाणपत्र जोड़ने के लिए "हां" प्रदान करें।

सत्यापन:

C:\tools>"%JAVA_HOME%/bin/java" SSLPoke <hostname> 443
Successfully connected    

5

मैं इसे केवल कोड के साथ काम कर पा रहा था, अर्थात कीटूल का उपयोग करने की कोई आवश्यकता नहीं है:

import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicIntProperty;
import com.netflix.config.DynamicPropertyFactory;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
import org.apache.http.nio.conn.NoopIOSessionStrategy;
import org.apache.http.nio.conn.SchemeIOSessionStrategy;
import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class Test
{
    private static final DynamicIntProperty MAX_TOTAL_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty ROUTE_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty CONNECT_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connect.timeout", 60000);
    private static final DynamicIntProperty SOCKET_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.socket.timeout", -1);
    private static final DynamicIntProperty CONNECTION_REQUEST_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connectionrequest.timeout", 60000);
    private static final DynamicBooleanProperty STALE_CONNECTION_CHECK = DynamicPropertyFactory.getInstance().getBooleanProperty("X.checkconnection", true);

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

        SSLContext sslcontext = SSLContexts.custom()
                .useTLS()
                .loadTrustMaterial(null, new TrustStrategy()
                {
                    @Override
                    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
                    {
                        return true;
                    }
                })
                .build();
        SSLIOSessionStrategy sslSessionStrategy = new SSLIOSessionStrategy(sslcontext, new AllowAll());

        Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
                .register("http", NoopIOSessionStrategy.INSTANCE)
                .register("https", sslSessionStrategy)
                .build();

        DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(IOReactorConfig.DEFAULT);
        PoolingNHttpClientConnectionManager connectionManager = new PoolingNHttpClientConnectionManager(ioReactor, sessionStrategyRegistry);
        connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS.get());
        connectionManager.setDefaultMaxPerRoute(ROUTE_CONNECTIONS.get());

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(SOCKET_TIMEOUT.get())
                .setConnectTimeout(CONNECT_TIMEOUT.get())
                .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT.get())
                .setStaleConnectionCheckEnabled(STALE_CONNECTION_CHECK.get())
                .build();

        CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
                .setSSLStrategy(sslSessionStrategy)
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .build();

        httpClient.start();

        // use httpClient...
    }

    private static class AllowAll implements X509HostnameVerifier
    {
        @Override
        public void verify(String s, SSLSocket sslSocket) throws IOException
        {}

        @Override
        public void verify(String s, X509Certificate x509Certificate) throws SSLException {}

        @Override
        public void verify(String s, String[] strings, String[] strings2) throws SSLException
        {}

        @Override
        public boolean verify(String s, SSLSession sslSession)
        {
            return true;
        }
    }
}

1
Btw, मैं httpasyncclient का उपयोग कर रहा हूं: 4.0.1
जोनास बर्गस्ट्रॉम

मुझे कुछ इसी तरह की जरूरत थी, @ JonasBergström, SSLContext के साथ आपका समाधान बहुत मदद करता है।
EnterSB

8
ध्यान दें कि यह समाधान असुरक्षित है।
लोर्ने का मार्किव

जोनास धन्यवाद, आपका समाधान समस्या को हल करता है। लेकिन मैंने पाया कि पहले कनेक्शन को बनाने में बहुत लंबा समय (3 - 5 एस) लगता है, उसके बाद हर कनेक्शन के लिए केवल 300-400 एमएस की जरूरत होती है।
ट्वकाई

5

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

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
    ... 22 more

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


ssllabs.com/ssltest एक तारणहार है, बस इसकी तुलना एक कार्यशील प्रमाणित सत्यापन के साथ करनी होगी।
किशन

5

केवल Windows के लिए, इन चरणों का पालन करें:

  1. क्रोम में सेटिंग्स पर जाएं।
  2. सेटिंग्स में, अग्रिम सेटिंग दिखाएं पर क्लिक करें।
  3. HTTPS / SSL के तहत मैनेज सर्टिफिकेट पर क्लिक करें।
  4. आपका प्रमाणपत्र निर्यात करें।
  5. विंडोज सर्च में (कीबोर्ड पर विंडो की दबाकर) जावा टाइप करें।
  6. Select (जावा कॉन्फ़िगर करें) विकल्प जो जावा कंट्रोल पैनल को खोलेगा
  7. जावा कंट्रोल पैनल में सुरक्षा टैब का चयन करें
  8. प्रमाणपत्रों का प्रबंधन करें का चयन करें
  9. आयात पर क्लिक करें
  10. के तहत (उपयोगकर्ता) टैब चयनित और प्रमाण पत्र प्रकार (विश्वसनीय प्रमाण पत्र)
  11. आयात बटन पर क्लिक करें और डाउनलोड किए गए प्रमाण पत्र पर ब्राउज़ करें और इसे आयात करें।

4

उन लोगों के लिए जो डेबियन को पसंद करते हैं और जावा को प्रीपैक्ड करते हैं:

sudo mkdir /usr/share/ca-certificates/test/  # don't mess with other certs
sudo cp ~/tmp/test.loc.crt /usr/share/ca-certificates/test/
sudo dpkg-reconfigure --force ca-certificates  # check your cert in curses GUI!
sudo update-ca-certificates --fresh --verbose

इसके लिए जांच करना न भूलें /etc/default/cacerts:

# enable/disable updates of the keystore /etc/ssl/certs/java/cacerts
cacerts_updates=yes

प्रमाणपत्र निकालने के लिए:

sudo rm /usr/share/ca-certificates/test/test.loc.crt
sudo rm /etc/ssl/certs/java/cacerts
sudo update-ca-certificates --fresh --verbose

2

यह जावा 7 के साथ GoDaddy certs का उपयोग करने के कारण भी हो सकता है जो SHA2 का उपयोग करके हस्ताक्षरित हैं।

Chrome और अन्य सभी ब्राउज़र, SSL सेट को हटाना शुरू कर रहे हैं जो SHA1 का उपयोग करके हस्ताक्षरित हैं, क्योंकि यह उतना सुरक्षित नहीं है।

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


2

मुझे प्रमाणपत्र त्रुटि के साथ एक ही समस्या थी और यह एसएनआई के कारण था, और http क्लाइंट जो मैंने उपयोग किया था वह एसएनआई लागू नहीं था। तो एक वर्जन अपडेट ने काम किया

   <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>

2

अद्यतन: एक रिबूट मदद की संयोग था (मुझे आशा थी, हुर्रे!)। समस्या का वास्तविक कारण यह था: जब ग्रैडल को एक विशिष्ट कीस्टोर का उपयोग करने के लिए निर्देशित किया जाता है, तो किस्टोर में सभी आधिकारिक रूट प्रमाणपत्र भी होने चाहिए। अन्यथा यह नियमित रिपॉजिटरी से पुस्तकालयों तक नहीं पहुंच सकता है। मुझे यह करना था:

स्व-हस्ताक्षरित प्रमाणपत्र आयात करें:

keytool -import -trustcacerts -alias myselfsignedcert -file /Users/me/Desktop/selfsignedcert.crt -keystore ./privateKeystore.jks

आधिकारिक मूल प्रमाणपत्र जोड़ें:

keytool -importkeystore -srckeystore <java-home>/lib/security/cacerts -destkeystore ./privateKeystore.jks

शायद ग्रैडल डेमन भी रास्ते में मिल गया। ./gradlew --statusअगर सभी चीजें धुंधली दिखने लगें, तो सभी चल रहे डेमन को मारने लायक हो सकता है ।

मूल पोस्टिंग:

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

पृष्ठभूमि: ./gradlew जार ने मुझे "अनुरोधित लक्ष्य के लिए वैध प्रमाणीकरण मार्ग खोजने में असमर्थ" रखा।

मैं एक स्व-हस्ताक्षरित प्रमाण पत्र के साथ अटक गया हूं, जो ब्राउज़र से सहेजा गया है, PrivateKeystore.jks में आयात किया गया है। फिर ग्रेडले को निर्देश दिए कि PrivateKeystore.jks के साथ काम करें:

org.gradle.jvmargs=-Djavax.net.debug=SSL -Djavax.net.ssl.trustStore="/Users/me/IntelliJ/myproject/privateKeystore.jks"  -Djavax.net.ssl.trustStorePassword=changeit

जैसा कि उल्लेख किया गया है, यह केवल एक रिबूट के बाद काम करता है।


2

AVG संस्करण 18.1.3044 (विंडोज 10 के साथ) मेरे स्थानीय स्प्रिंग एप्लिकेशन के साथ हस्तक्षेप करता है।

समाधान: AVG अनुभाग में "वेब और ईमेल" दर्ज करें और "ईमेल सुरक्षा" को अक्षम करें। यदि साइट सुरक्षित नहीं है, तो AVG प्रमाणपत्र को ब्लॉक करें।


2

सुनिश्चित करें कि https://176.66.3.69:6443/ के पास एक वैध प्रमाण पत्र है। https सुरक्षित नहीं हैयदि आप ब्राउज़र में काम करते हैं तो आप इसे पहले ब्राउज़र के माध्यम से देख सकते हैं कि यह जावा में काम करेगा।

वह मेरे लिए काम कर रहा है


और अगर ब्राउज़र भी शिकायत करे तो मुझे क्या करना चाहिए?
द गॉडफादर

प्रमाण पत्र स्थापित करने का प्रयास करें
अमृत ​​इब्राहिम

2

इसे हल करने के लिए बहुत सारे तरीके हैं ...

एक तरह से एक कीस्टोर फ़ाइल में ट्रस्टस्टोर प्रमाणपत्र सेट किया जाता है और इसे एप्लिकेशन के पथ में रखा जाता है, और इन सिस्टम गुणों को मुख्य विधि में सेट किया जाता है:

public static void main(String[] args) {
  System.setProperty("javax.net.ssl.trustStore", "trust-store.jks");
  System.setProperty("javax.net.ssl.trustStorePassword", "TrustStore");
  ...
}

अन्य तरीका प्रोजेक्ट की फ़ाइल के अंदर संसाधन फ़ाइल के रूप में कीस्टोर रखें और इसे लोड करें:

public static SSLContext createSSLContext(String resourcePath, String pass) throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException, KeyManagementException {
  // initialise the keystore
  final char[] password = pass.toCharArray();
  KeyStore ks = KeyStore.getInstance("JKS");
  ks.load(ThisClass.class.getResourceAsStream(resourcePath
  ), password);

  // Setup the key manager factory.
  KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
  kmf.init(ks, password);

  // Setup the trust manager factory.
  TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
  tmf.init(ks);

  SSLContext sslc = SSLContext.getInstance("TLS");
  sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
  return sslc;
}

public static void main(String[] args) {
  SSLContext.setDefault(
    createSSLContext("/trust-store.jks", "TrustStore"));
  ...
}

खिड़कियों में आप इस समाधान को भी आज़मा सकते हैं: https://stackoverflow.com/a/59056537/980442


मैंने .crtइस तरह से एक प्रमाणपत्र प्राधिकारी CA फ़ाइल से कीस्टोर फ़ाइल बनाई :

keytool -import -alias ca -keystore trust-store.jks -storepass TrustStore -trustcacerts -file ca.crt

FYI करें: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminssclclub.html


1

आपके पास दो विकल्प हैं, प्रत्येक jvm के लिए जावा के कीस्टोर में स्व-हस्ताक्षरित प्रमाण पत्र आयात करें, जो सॉफ्टवेयर को चलाएगा या गैर-वैध एसएलएल कारखाने की कोशिश करेगा:

jdbc:postgresql://myserver.com:5432/mydatabasename?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

1

इस छवि की तरह मुद्दा था।

यहां छवि विवरण दर्ज करें

कुछ उपाय आजमाया। लेकिन यह पाया कि भले ही यह एक ही परियोजना है, जब यह दूसरे के काम करने की जगह पर है, यह पूरी तरह से ठीक है। कोई अतिरिक्त सेटिंग्स की जरूरत है। इसलिए हमने अनुमान लगाया कि यह एक पर्यावरणीय मुद्दा है। हमने JDK संस्करण, IDE को बदलने की कोशिश की लेकिन काम नहीं किया। जांच में लगभग 4 घंटे लगे, जब तक कि हमने टॉप-रेटेड उत्तर की कोशिश नहीं की। मुझे उस उत्तर में उल्लिखित त्रुटि नहीं मिली, लेकिन मैंने अपने ब्राउज़र के माध्यम से HTTP URL (लॉक) के बारे में पाया कि वहाँ चार्ल्स का प्रमाणीकरण था। तब मुझे एहसास हुआ कि मेरा आकर्षण हर समय था। जब तक मैंने इसे बंद कर दिया, यह सब ठीक काम कर रहा है।

इसलिए मैंने अपना अनुभव छोड़ दिया जो आपके मामले के लिए मददगार हो सकता है।


0

मेरे मामले में मैं जावा 1.6 के साथ मैको हाई सिएरा चला रहा हूं। कैबर्ट फ़ाइल गैब मार्टिन-डेम्पसी के उत्तर में उल्लिखित की तुलना में एक अलग स्थान पर है। कैसर्ट फ़ाइल पहले से ही किसी अन्य स्थान (/ लाइब्रेरी / इंटरनेट प्लग-इन / JavaAppletPlugin.plugin / Contents / Home / lib / security / cacerts) से जुड़ी हुई थी।

फ़ायर्फ़ॉक्स का उपयोग करते हुए, मैंने वेब साइट से एक स्थानीय फ़ाइल में "ExportCertFile.crt" नामक एक फ़ाइल का प्रमाण पत्र निर्यात किया। वहाँ से, मैंने cacert फ़ाइल में प्रमाणपत्र को स्थानांतरित करने के लिए keytool का उपयोग किया। इससे समस्या ठीक हो गई।

bash-3.2# cd /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/
bash-3.2# keytool -importcert -file ~/exportedCertFile.crt -alias example -keystore cacerts -storepass changeit

0

पहले ssl सर्टिफिकेट डाउनलोड करें फिर आप अपने जावा बिन पथ पर जा सकते हैं, कंसोल में नीचे कमांड निष्पादित करें।

C:\java\JDK1.8.0_66-X64\bin>keytool -printcert -file C:\Users\lova\openapi.cer -keystore openapistore

-1

मेरे मामले में मेरे पास कीस्टोर और ट्रस्टस्टोर दोनों एक ही प्रमाण पत्र थे इसलिए ट्रस्टस्टोर को हटाने से मदद मिली। कभी-कभी प्रमाण पत्र की श्रृंखला एक मुद्दा हो सकती है यदि आप प्रमाण पत्र की कई प्रतियां हैं।

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