web-dev-qa-db-ja.com

Apache HttpClientで無効なSSL証明書を処理する方法は?

私は知っています、この問題については多くの異なる質問と非常に多くの答えがあります...しかし、私は理解できません...

私は持っています:ubuntu-9.10-desktop-AMD64 + NetBeans6.7.1は「そのまま」オフからインストールされました。担当者HTTPS経由でいくつかのサイトに接続する必要があります。これには、ApacheのHttpClientを使用します。

私が読んだチュートリアルから:

「JSSEを正しくインストールしたら、SSLを介した安全なHTTP通信は次のようになります。
単純なHTTP通信のように単純です。」そしていくつかの例:

HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.verisign.com/"); 
try { 
  httpclient.executeMethod(httpget);
  System.out.println(httpget.getStatusLine());
} finally {
  httpget.releaseConnection();
}

今では、これを書いています:

HttpClient client = new HttpClient();

HttpMethod get = new GetMethod("https://mms.nw.ru");
//get.setDoAuthentication(true);

try {
    int status = client.executeMethod(get);
    System.out.println(status);

    BufferedInputStream is = new BufferedInputStream(get.getResponseBodyAsStream());
    int r=0;byte[] buf = new byte[10];
    while((r = is.read(buf)) > 0) {
        System.out.write(buf,0,r);
    }

} catch(Exception ex) {
    ex.printStackTrace();
}

その結果、一連のエラーがあります。

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:1627)
        at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:204)
        at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:198)
        at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:994)
        at Sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:142)
        at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:533)
        at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:471)
        at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:904)
        at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1132)
        at Sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.Java:643)
        at Sun.security.ssl.AppOutputStream.write(AppOutputStream.Java:78)
        at Java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.Java:82)
        at Java.io.BufferedOutputStream.flush(BufferedOutputStream.Java:140)
        at org.Apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.Java:828)
        at org.Apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.Java:2116)
        at org.Apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.Java:1096)
        at org.Apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.Java:398)
        at org.Apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.Java:171)
        at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:397)
        at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:323)
        at simpleapachehttp.Main.main(Main.Java:41)
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(PKIXValidator.Java:302)
        at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:205)
        at Sun.security.validator.Validator.validate(Validator.Java:235)
        at Sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:147)
        at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:230)
        at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:270)
        at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:973)
        ... 17 more
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:191)
        at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:255)
        at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:297)
        ... 23 more

最も簡単なSSL接続を作成するにはどうすればよいですか? (おそらくKeyManagerとTrust Managerなどはありませんが。)

116
rauch

https://mms.nw.r は、信頼マネージャのデフォルトセットに含まれていない自己署名証明書を使用します。

次のいずれかが必要です。

  • 証明書を受け入れるTrustManagerでSSLContextを構成します(以下を参照)

  • 証明書を含む適切な信頼ストアでSSLContextを構成します

  • そのサイトの証明書をデフォルトのJavaトラストストアに追加します。

以下は、証明書を受け入れる(ほとんど価値のない)SSLコンテキストを作成するサンプルプログラムです。

import Java.net.URL;
import Java.security.SecureRandom;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLTest {

    public static void main(String [] args) throws Exception {
        // configure the SSLContext with a TrustManager
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        URL url = new URL("https://mms.nw.ru");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
        System.out.println(conn.getResponseCode());
        conn.disconnect();
    }

    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
}
152
Kevin

https://mms.nw.ru は、おそらく認証局によって発行されていない証明書を使用します。したがって、 で説明されているように、信頼できるJavaキーストアに証明書を追加する必要があります。要求されたターゲットへの有効な証明書パスが見つかりません

Httpsプロトコルで実行されているSSL対応サーバーで動作するクライアントで作業している場合、サーバー証明書が認証機関によって発行されていないが、プライベートCMS。

パニックにならないでください。クライアントがJavaで作成されている場合は、信頼できるJavaキーストアにサーバー証明書を追加するだけです。サーバーがインストールされているマシンにアクセスできないかのように思われるかもしれません。あなたを助けることができる簡単なプログラムがあります。 Javaプログラムをダウンロードして 実行してください

% Java InstallCert _web_site_hostname_

このプログラムは、指定されたホストへの接続を開き、SSLハンドシェイクを開始しました。発生したエラーの例外スタックトレースを出力し、サーバーで使用されている証明書を表示します。これで、信頼できるキーストアに証明書を追加するように求められます。

気が変わったら、「q」と入力します。本当に証明書を追加したい場合は、「1」または他の番号を入力して他の証明書、CA証明書を追加しますが、通常はそれを行いたくありません。選択すると、プログラムは完全な証明書を表示し、現在のディレクトリの「jssecacerts」という名前のJava KeyStoreに追加します。

プログラムで使用するには、信頼ストアとして使用するようにJSSEを構成するか、$ Java_HOME/jre/lib/securityディレクトリにコピーします。すべてのJavaアプリケーションが証明書をJSSEだけでなく信頼できる証明書として認識するようにする場合は、そのディレクトリのcacertsファイルを上書きすることもできます。

その後、JSSEはホストとのハンドシェイクを完了することができます。これは、プログラムを再度実行することで確認できます。

詳細については、Leelandのブログをご覧ください これ以上「要求されたターゲットへの有効な認証パスを見つけることができません」

44
Pascal Thivent

Pascal Thiventの正解に加えて、別の方法は、Firefoxから証明書を保存(証明書の表示->詳細->エクスポート)またはopenssl s_clientして、それをトラストストアにインポートすることです。

これは、その証明書を検証する方法がある場合にのみ行う必要があります。それに失敗すると、最初に接続するときに実行します。少なくとも後続の接続で証明書が予期せず変更された場合、少なくともエラーが発生します。

トラストストアにインポートするには、次を使用します。

keytool -importcert -keystore truststore.jks -file servercert.pem

デフォルトでは、デフォルトのトラストストアはlib/security/cacertsであり、パスワードはchangeitである必要があります。詳細については、 JSSEリファレンスガイドを参照してください .

その証明書をグローバルに許可したくないが、これらの接続に対してのみ許可する場合は、SSLContextを作成できます。

TrustManagerFactory tmf = TrustManagerFactory
    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("/.../truststore.jks");
ks.load(fis, null);
// or ks.load(fis, "thepassword".toCharArray());
fis.close();

tmf.init(ks);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);

次に、このSecureProtocolSocketFactoryを使用するためにその SSLContext を実装することにより、Apache HTTPクライアント3.x用にセットアップする必要があります。 (例があります here )。

Apache HTTPクライアント4.x(初期バージョンを除く)は、SSLContextの受け渡しを直接サポートしています。

23
Bruno

Apache HttpClient 4.5の方法:

org.Apache.http.ssl.SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
sslContextBuilder.loadTrustMaterial(new org.Apache.http.conn.ssl.TrustSelfSignedStrategy());
SSLContext sslContext = sslContextBuilder.build();
org.Apache.http.conn.ssl.SSLConnectionSocketFactory sslSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new org.Apache.http.conn.ssl.DefaultHostnameVerifier());

HttpClientBuilder httpClientBuilder = HttpClients.custom().setSSLSocketFactory(sslSocketFactory);
httpClient = httpClientBuilder.build();

注:org.Apache.http.conn.ssl.SSLContextBuilder非推奨であり、org.Apache.http.ssl.SSLContextBuilderは新しいものです(後者のパッケージ名にconnがないことに注意してください)。

11
Anton Krosnev

http://hc.Apache.org/httpclient-3.x/sslguide.html から:

Protocol.registerProtocol("https", 
new Protocol("https", new MySSLSocketFactory(), 443));
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.whatever.com/");
try {
  httpclient.executeMethod(httpget);
      System.out.println(httpget.getStatusLine());
} finally {
      httpget.releaseConnection();
}

MySSLSocketFactoryのサンプルが見つかる場所 hereTrustManagerを参照します。これを変更して、すべてを信頼することができます(ただし、これを考慮する必要があります!)

10
Bozho

Apache HttpClient 4.5+およびJava8の場合:

SSLContext sslContext = SSLContexts.custom()
        .loadTrustMaterial((chain, authType) -> true).build();

SSLConnectionSocketFactory sslConnectionSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new String[]
        {"SSLv2Hello", "SSLv3", "TLSv1","TLSv1.1", "TLSv1.2" }, null,
        NoopHostnameVerifier.INSTANCE);
CloseableHttpClient client = HttpClients.custom()
        .setSSLSocketFactory(sslConnectionSocketFactory)
        .build();

ただし、HttpClientが接続を求めるためにConnectionManagerを使用する場合、たとえば次のようになります

 PoolingHttpClientConnectionManager connectionManager = new 
         PoolingHttpClientConnectionManager();

 CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();

HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory)は効果がありません、問題は解決されません。

HttpClientは接続を探すために指定されたconnectionManagerを使用し、指定されたconnectionManagerはカスタマイズされたSSLConnectionSocketFactoryを登録していないためです。これを解決するには、connectionManagerでカスタマイズされたSSLConnectionSocketFactoryを登録する必要があります。正しいコードは次のようになります。

PoolingHttpClientConnectionManager connectionManager = new 
    PoolingHttpClientConnectionManager(RegistryBuilder.
                <ConnectionSocketFactory>create()
      .register("http",PlainConnectionSocketFactory.getSocketFactory())
      .register("https", sslConnectionSocketFactory).build());

CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();
6
EyouGo

(上記で作成したgreat InstallCertクラスを使用して)Java Cert Storeを取得したら、Javaを取得して、「javax。 Java起動時のnet.ssl.trustStore "パラメーター。

例:

Java -Djavax.net.ssl.trustStore=/path/to/jssecacerts MyClassName
4
Brian M. Carr

自己署名テスト証明書で発生する可能性がある別の問題は次のとおりです。

Java.io.IOException:HTTPSホスト名が間違っています:...

このエラーは、HTTPS URLにアクセスしようとしたときに発生します。サーバー証明書をJREのキーストアに既にインストールしている場合があります。ただし、このエラーは、サーバー証明書の名前がURLに記載されているサーバーの実際のドメイン名と一致しないことを意味します。これは通常、非CA発行の証明書を使用している場合に発生します。

次の例は、証明書サーバー名を無視するHttpsURLConnection DefaultHostnameVerifierを記述する方法を示しています。

http://www.Java-samples.com/showtutorial.php?tutorialid=211

3
Kiwicmc

すべてのチェックを破棄せずに実行時に信頼するホストを簡単に追加する方法については、次のコードを試してください: http://code.google.com/p/self-signed-cert-trust-manager/ =。

2
Matt Olsen

答えをここに貼り付けたい:

apache HttpClient 4.5.5で

Apacheクライアント4.5.5で無効なSSL証明書を処理する方法?

HttpClient httpClient = HttpClients
            .custom()
            .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .build();
1
aaron

EasySSLProtocolSocketFactoryから問題が発生していたため、独自のProtocolSocketFactoryを実装することになりました。

最初に登録する必要があります:

Protocol.registerProtocol("https", new Protocol("https", new TrustAllSSLSocketFactory(), 443));

HttpClient client = new HttpClient();
...

次に、ProtocolSocketFactoryを実装します。

class TrustAllSSLSocketFactory implements ProtocolSocketFactory {

    public static final TrustManager[] TRUST_ALL_CERTS = new TrustManager[]{
        new X509TrustManager() {
            public void checkClientTrusted(final X509Certificate[] certs, final String authType) {

            }

            public void checkServerTrusted(final X509Certificate[] certs, final String authType) {

            }

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

    private TrustManager[] getTrustManager() {
        return TRUST_ALL_CERTS;
    }

    public Socket createSocket(final String Host, final int port, final InetAddress clientHost,
                               final int clientPort) throws IOException {
        return getSocketFactory().createSocket(Host, port, clientHost, clientPort);
    }

    @Override
    public Socket createSocket(final String Host, final int port, final InetAddress localAddress,
                               final int localPort, final HttpConnectionParams params) throws IOException {
        return createSocket(Host, port);
    }

    public Socket createSocket(final String Host, final int port) throws IOException {
        return getSocketFactory().createSocket(Host, port);
    }

    private SocketFactory getSocketFactory() throws UnknownHostException {
        TrustManager[] trustAllCerts = getTrustManager();

        try {
            SSLContext context = SSLContext.getInstance("SSL");
            context.init(null, trustAllCerts, new SecureRandom());

            final SSLSocketFactory socketFactory = context.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
            return socketFactory;
        } catch (NoSuchAlgorithmException | KeyManagementException exception) {
            throw new UnknownHostException(exception.getMessage());
        }
    }
}

注:これは、HttpClient 3.1およびJava 8を使用します

1
Daniel Treiber

installCert.Javaプログラムファイルを使用してSSL証明書を作成するには、Java 1.7について以下の指示に従ってください。

https://github.com/escline/InstallCert

tomcatを再起動する必要があります

0
Allahbakash.G

私はhttpclient 3.1.Xを使用していますが、これは私のために機能します

        try {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        sslContext.init(null, new TrustManager[]{trustManager}, null);
        SslContextSecureProtocolSocketFactory socketFactory = new SslContextSecureProtocolSocketFactory(sslContext,false);
        Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory) socketFactory, 443));//同样会影响到HttpUtils
    } catch (Throwable e) {
        e.printStackTrace();

}

public class SslContextSecureProtocolSocketFactory implements      SecureProtocolSocketFactory {

private SSLContext sslContext;
private boolean verifyHostname;

public SslContextSecureProtocolSocketFactory(SSLContext sslContext, boolean verifyHostname) {
    this.verifyHostname = true;
    this.sslContext = sslContext;
    this.verifyHostname = verifyHostname;
}

public SslContextSecureProtocolSocketFactory(SSLContext sslContext) {
    this(sslContext, true);
}

public SslContextSecureProtocolSocketFactory(boolean verifyHostname) {
    this((SSLContext)null, verifyHostname);
}

public SslContextSecureProtocolSocketFactory() {
    this((SSLContext)null, true);
}

public synchronized void setHostnameVerification(boolean verifyHostname) {
    this.verifyHostname = verifyHostname;
}

public synchronized boolean getHostnameVerification() {
    return this.verifyHostname;
}

public Socket createSocket(String Host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(Host, port, clientHost, clientPort);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(String Host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
    if(params == null) {
        throw new IllegalArgumentException("Parameters may not be null");
    } else {
        int timeout = params.getConnectionTimeout();
        Socket socket = null;
        SSLSocketFactory socketfactory = this.getSslSocketFactory();
        if(timeout == 0) {
            socket = socketfactory.createSocket(Host, port, localAddress, localPort);
        } else {
            socket = socketfactory.createSocket();
            InetSocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
            InetSocketAddress remoteaddr = new InetSocketAddress(Host, port);
            socket.bind(localaddr);
            socket.connect(remoteaddr, timeout);
        }

        this.verifyHostname((SSLSocket)socket);
        return socket;
    }
}

public Socket createSocket(String Host, int port) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(Host, port);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(Socket socket, String Host, int port, boolean autoClose) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(socket, Host, port, autoClose);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

private void verifyHostname(SSLSocket socket) throws SSLPeerUnverifiedException, UnknownHostException {
    synchronized(this) {
        if(!this.verifyHostname) {
            return;
        }
    }

    SSLSession session = socket.getSession();
    String hostname = session.getPeerHost();

    try {
        InetAddress.getByName(hostname);
    } catch (UnknownHostException var10) {
        throw new UnknownHostException("Could not resolve SSL sessions server hostname: " + hostname);
    }

    X509Certificate[] certs = (X509Certificate[])((X509Certificate[])session.getPeerCertificates());
    if(certs != null && certs.length != 0) {
        X500Principal subjectDN = certs[0].getSubjectX500Principal();
        List cns = this.getCNs(subjectDN);
        boolean foundHostName = false;
        Iterator i$ = cns.iterator();
        AntPathMatcher matcher  = new AntPathMatcher();
        while(i$.hasNext()) {
            String cn = (String)i$.next();
            if(matcher.match(cn.toLowerCase(),hostname.toLowerCase())) {
                foundHostName = true;
                break;
            }
        }

        if(!foundHostName) {
            throw new SSLPeerUnverifiedException("HTTPS hostname invalid: expected \'" + hostname + "\', received \'" + cns + "\'");
        }
    } else {
        throw new SSLPeerUnverifiedException("No server certificates found!");
    }
}

private List<String> getCNs(X500Principal subjectDN) {
    ArrayList cns = new ArrayList();
    StringTokenizer st = new StringTokenizer(subjectDN.getName(), ",");

    while(st.hasMoreTokens()) {
        String cnField = st.nextToken();
        if(cnField.startsWith("CN=")) {
            cns.add(cnField.substring(3));
        }
    }

    return cns;
}

protected SSLSocketFactory getSslSocketFactory() {
    SSLSocketFactory sslSocketFactory = null;
    synchronized(this) {
        if(this.sslContext != null) {
            sslSocketFactory = this.sslContext.getSocketFactory();
        }
    }

    if(sslSocketFactory == null) {
        sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
    }

    return sslSocketFactory;
}

public synchronized void setSSLContext(SSLContext sslContext) {
    this.sslContext = sslContext;
}

}

0
acoder2013

InstallCertを使用してjssecacertsファイルを生成し、-Djavax.net.ssl.trustStore=/path/to/jssecacertsを実行すると非常にうまくいきました。

0
Dexin Wang

HttpClientの場合、これを実行できます。

SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        String uri = new StringBuilder("url").toString();

        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        };

        HttpClient client = HttpClientBuilder.create().setSSLContext(ctx)
                .setSSLHostnameVerifier(hostnameVerifier).build()
0
sorabh solanki

たまたま同じ問題に直面しましたが、突然すべてのインポートが失われました。 .m2フォルダー内のすべてのコンテンツを削除してみました。そして、すべてを再インポートしようとしましたが、まだ何も機能しませんでした。最後に、私がやったことは、IDEがブラウザでダウンロードできないと不平を言っているWebサイトを開いたことです。そして、それが使用していた証明書を見て、私の中で見た

$ keytool -v -list  PATH_TO_Java_KEYSTORE

キーストアへのパスは/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacertsでした

その特定の証明書はありませんでした。

そのため、証明書をJava JVMキーストアに再度配置するだけです。以下のコマンドを使用して実行できます。

$ keytool -import -alias ANY_NAME_YOU_WANT_TO_GIVE -file PATH_TO_YOUR_CERTIFICATE -keystore PATH_OF_Java_KEYSTORE

パスワードを要求された場合、上記のコマンドの実行時にアクセス権エラーが発生した場合は、デフォルトのパスワード「changeit」を試してください。 Windowsでは、管理モードで開きます。 MacおよびUNIXでは、Sudoを使用します。

キーを正常に追加したら、次を使用して表示できます。

$ keytool -v -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 

Tehコマンドを使用してSHA-1のみを表示できます

$ keytool -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 
0
Adarsh S N

この リンク は、ステップごとの要件を説明しています。どの証明書を実際に心配していない場合は、以下のリンクのプロセスを進めることができます。

注:これは安全でない操作であるため、実行していることを再確認することをお勧めします。

0
Raghu Kiran

DefaultTrustManagerと共に以下を使用し、httpclientでcharmのように機能しました。トンありがとう!! @ケビンと他のすべての貢献者

    SSLContext ctx = null;
    SSLConnectionSocketFactory sslsf = null;
    try {

        ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        sslsf = new SSLConnectionSocketFactory(
                ctx,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());

    } catch (Exception e) {
        e.printStackTrace();
    }

     CloseableHttpClient client = HttpClients.custom()
            .setSSLSocketFactory(sslsf)
            .build();