java - জাভা: sun.security.provider.certpath.SunCertPathBuilderException: অনুরোধ করা লক্ষ্যের বৈধ শংসাপত্র পথ খুঁজে পেতে অক্ষম




ssl https (14)

আমার একটি ক্লাস আছে যা একটি 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

  1. ফায়ারফক্স ব্যবহার করে SSL সার্টিফিকেট রপ্তানি করুন। আপনি ব্রাউজারে URL টি আঘাত করে এটি রপ্তানি করতে পারেন এবং তারপরে সার্টিফিকেট রপ্তানি করার বিকল্পটি নির্বাচন করুন। আসুন সার্টিফিকেট ফাইলের নাম আপনার .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. আপনার জাভা প্রক্রিয়া পুনরায় আরম্ভ করুন

@ গাবে মার্টিন-ডেম্পেসির উত্তর আমাকে সাহায্য করেছে। এবং আমি এটি সম্পর্কিত একটি ছোট স্ক্রিপ্ট লিখেছেন। ব্যবহার খুব সহজ।

হোস্ট থেকে একটি শংসাপত্র ইনস্টল করুন:

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

আপনার কাছে দুটি বিকল্প রয়েছে, প্রতিটি জাভিএম সফ্টওয়্যারটি চালানো বা অ-যাচাইযোগ্য এসএসএল ফ্যাক্টরিটি চেষ্টা করার জন্য জাভা এর মূল দোকানটিতে স্ব স্বাক্ষরযোগ্য শংসাপত্র আমদানি করুন:

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

আপনার সার্ভার স্ব স্বাক্ষর সাইন স্বাক্ষর যখন সমস্যা প্রদর্শিত হবে। এটি কার্যকর করার জন্য আপনি এই শংসাপত্রটিকে আপনার JVM এর বিশ্বস্ত শংসাপত্রগুলির তালিকাতে যুক্ত করতে পারেন।

এই প্রবন্ধে লেখক বর্ণনা করেছেন যে কিভাবে আপনার ব্রাউজার থেকে শংসাপত্র আনতে হবে এবং এটি আপনার JVM এর ক্যাক্স্ট ফাইলগুলিতে যোগ করুন। আপনি either JAVA_HOME/jre/lib/security/cacerts ফাইলটি সম্পাদনা করতে পারেন অথবা -Djavax.net.ssl.trustStore পরামিতির সাথে আপনার অ্যাপ্লিকেশন চালাতে পারেন। আপনি যে JDK / JRE ব্যবহার করছেন তা যাচাই করুন এটি প্রায়শই বিভ্রান্তির উৎস।

আরও দেখুন: SSL শংসাপত্রের সার্ভারগুলির নামগুলি কীভাবে সমাধান করা যায় / কীটোল ব্যবহার করে আমি বিকল্প নাম যোগ করতে পারি? আপনি java.security.cert.CertificateException: No name matching localhost found রান করেন java.security.cert.CertificateException: No name matching localhost found ব্যতিক্রম java.security.cert.CertificateException: No name matching localhost found


আমার কাছে সার্টিফিকেট ত্রুটির সাথেও একই সমস্যা ছিল এবং SNI এবং http ক্লায়েন্ট যা আমি ব্যবহার করেছি তা SNI প্রয়োগ করা হয়নি। সুতরাং একটি সংস্করণ আপডেট কাজ করেনি

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

আমার ক্ষেত্রে আমি জাভা 1.6 এর সাথে MacOs হাই সিয়েরা পরিচালনা করছি। গ্যকেট মার্টিন-ডেম্পেসির উত্তরের উপরে উল্লেখিত রেফারেন্সের তুলনায় cacert ফাইল একটি ভিন্ন অবস্থানে রয়েছে। Cecert ফাইলটি ইতিমধ্যে অন্য অবস্থান (/ লাইব্রেরী / ইন্টারনেট প্ল্যাগ-ইনস / জাভাআপ্লেট প্লাগইন প্লাগইন / সামগ্রী / হোম / lib / নিরাপত্তা / cacerts) সাথে সংযুক্ত ছিল।

ফায়ারফক্স ব্যবহার করে, আমি "exportedCertFile.crt" নামে একটি স্থানীয় ফাইলের প্রশ্নে ওয়েব সাইট থেকে শংসাপত্র রপ্তানি করেছি। সেখান থেকে, আমি সার্টিফিকেটকে সিচার্ট ফাইলে সরাতে 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


আমি এটি শুধুমাত্র কোড দিয়ে কাজ করতে সক্ষম হয়েছিলাম, অর্থাৎ কীটোল ব্যবহার করার প্রয়োজন নেই:

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;
        }
    }
}

এই আমার সমস্যা সমাধান,

আমাদের স্থানীয় জাভাতে সার্টিফিকেট আমদানি করতে হবে। যদি না আমরা নীচের ব্যতিক্রম পেতে পারে।

    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(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)

SSLPOKE একটি সরঞ্জাম যেখানে আপনি আপনার স্থানীয় মেশিন থেকে https সংযোগটি পরীক্ষা করতে পারেন।

সংযোগ পরীক্ষা করার কমান্ড:

"%JAVA_HOME%/bin/java" SSLPoke <hostname> 443
    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(PKIXValidator.java:387)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
        at sun.security.validator.Validator.validate(Validator.java:260)
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138)
        at SSLPoke.main(SSLPoke.java:31)
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to 
    requested target
        at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
        ... 15 more
keytool -import -alias brinternal -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file <cert path>

এটি প্রথমে "কীস্টোর পাসওয়ার্ডটি প্রবেশ করান" -এ প্রম্পট হবে: "পরিবর্তনটি ডিফল্ট পাসওয়ার্ড। এবং অবশেষে একটি প্রম্পট "এই শংসাপত্রটি বিশ্বাস করেন? [না]:", কীস্টোরে শংসাপত্র যোগ করার জন্য "হ্যাঁ" সরবরাহ করুন।

Verfication:

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

এখানে 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

নিশ্চিত করুন যে https://176.66.3.69:6443/ একটি বৈধ শংসাপত্র আছে। আপনি প্রথম ব্রাউজারের মাধ্যমে এটি চেক করতে পারেন যদি এটি ব্রাউজারে কাজ করে তবে এটি জাভাতে কাজ করবে।

যে আমার জন্য কাজ করছে


প্রথমে এসএসএল শংসাপত্রটি ডাউনলোড করুন তারপর আপনি আপনার জাভা বিন পাথে যেতে পারেন কনসোলের নীচের কমান্ডটি চালান।

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

যারা ডেবিয়ান এবং প্রিপাকেড জাভা পছন্দ করেন তাদের জন্য:

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

শুধুমাত্র উইন্ডোজের জন্য, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. ক্রোম সেটিংস যান।
  2. সেটিংসে অগ্রিম সেটিংস প্রদর্শন ক্লিক করুন।
  3. HTTPS / SSL এর অধীনে পরিচালনা শংসাপত্রগুলিতে ক্লিক করুন।
  4. আপনার সার্টিফিকেট রপ্তানি করুন।
  5. উইন্ডোজ অনুসন্ধানে (কীবোর্ডে উইন্ডোজ কী টিপে) জাভা টাইপ করুন।
  6. নির্বাচন করুন (জাভা কনফিগার করুন) বিকল্প যা জাভা কন্ট্রোল প্যানেল খুলবে
  7. জাভা কন্ট্রোল প্যানেলে নিরাপত্তা ট্যাব নির্বাচন করুন
  8. পরিচালনা সার্টিফিকেট নির্বাচন করুন
  9. আমদানি ক্লিক করুন
  10. অধীনে (ব্যবহারকারীর) ট্যাব নির্বাচিত এবং সার্টিফিকেট টাইপ (বিশ্বস্ত সার্টিফিকেট)
  11. আমদানি বোতামটি ক্লিক করুন এবং ডাউনলোড শংসাপত্র ব্রাউজ করুন এবং এটি আমদানি করুন।




ssl-certificate