私はこの問題を、現在のデフォルトの JVM トラステッド ホストの一部ではない証明書プロバイダーに突き止めましたJDK 8u74
。プロバイダーはwww.identrust.comですが、接続しようとしていたドメインではありませんでした。そのドメインは、このプロバイダーから証明書を取得していました。クロスルートは、JDK/JRE のデフォルト リストで信頼をカバーしますか?を参照してください。-- いくつかのエントリを読んでください。Let's Encrypt をサポートするブラウザとオペレーティング システムも参照してください。
そこで、興味のあるドメインに接続するためにidentrust.com
、次の手順を実行しました。基本的に、identrust.com ( DST Root CA X3
) 証明書を JVM によって信頼されるように取得する必要がありました。次のように Apache HttpComponents 4.5 を使用してそれを行うことができました。
1: Certificate Chain Download Instructionsで indettrust から証明書を取得します。DST ルート CA X3リンクをクリックします。
2: 文字列を「DST Root CA X3.pem」という名前のファイルに保存します。ファイルの先頭と末尾に「-----BEGIN CERTIFICATE-----」と「-----END CERTIFICATE-----」の行を必ず追加してください。
3: 次のコマンドを使用して、Java キーストア ファイル cacerts.jks を作成します。
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: 生成された cacerts.jks キーストアを java/(maven) アプリケーションの resources ディレクトリにコピーします。
5: 次のコードを使用してこのファイルをロードし、Apache 4.5 HttpClient に添付します。indetrust.com
これにより、 util oracleから発行された証明書を持つすべてのドメインの問題が解決され、JRE のデフォルト キーストアに証明書が含まれます。
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
プロジェクトがビルドされると、cacerts.jks がクラスパスにコピーされ、そこからロードされます。現時点では、他の SSL サイトに対してテストを行っていませんが、上記のコードがこの証明書で「チェーン」されている場合は、それらも機能しますが、わかりません。
参照:カスタム SSL コンテキストおよびJava HttpsURLConnection で自己署名証明書を受け入れるにはどうすればよいですか?