この問題を、の時点でデフォルトの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:証明書チェーンのダウンロード手順で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)アプリケーションのリソースディレクトリにコピーします。
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で自己署名証明書を受け入れるにはどうすればよいですか?