Web サイトからのすべての証明書はルート CA などによって署名されており、サーバーではなくクライアントを作成しているため、それらすべてに接続できる SSLEngine を作成するにはどうすればよいですか? または、接続するために証明書などをダウンロードする必要がありますか? (ほとんどのリンクはサーバーであるため、jdk が証明書に関するブラウザーと同じ情報をすべて持っていることを望んでいます。これは簡単に行うことができますが、ほとんどのリンクはサーバーであるため、Google のスキルを見つけるのに問題があります)。
編集:より明確にするために、自己署名証明書で動作するようなクライアントコードがあります。現在、クロムのロックをクリックして、必要なWebサイトから証明書をダウンロードしました。それをキーストアにインポートしましたが、まだ機能していません...
private SSLEngine createEngine() {
try {
InputStream in = this.getClass().getResourceAsStream("/prodKeyStore.jks");
//char[] passphrase = password.toCharArray();
// First initialize the key and trust material.
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(in, "lP9Ow1uYXZr9zgt6".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
//****************Client side specific*********************
// TrustManager's decide whether to allow connections.
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(null, tmf.getTrustManagers(), null);
//****************Client side specific*********************
SSLEngine engine = sslContext.createSSLEngine();
engine.setUseClientMode(true);
return engine;
} catch(Exception e) {
throw new RuntimeException("Could not create SSLEngine", e);
}
}
次に、SSL 交換のデバッグをオンにする方法を見つけて、それが役立つかどうかを確認します。現在、なぜこれが機能しないのか途方に暮れています。
痛い、デバッグログはこれを指している
javax.net.ssl|DEBUG|21|httpclient2|2020-02-18 08:13:05.095 MST|CertificateMessage.java:358|Consuming server Certificate handshake message (
"Certificates": [
"certificate" : {
"version" : "v3",
"serial number" : "00 90 76 89 18 E9 33 93 A0",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
"not before" : "2014-12-31 17:00:00.000 MST",
"not after" : "2029-12-31 17:00:00.000 MST",
"subject" : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
"subject public key" : "RSA",
"extensions" : [
そのため、何かが大きな問題を引き起こしていますが、まだ何が起こっているのかわかりません。jdk8です。これを修正する方法はまだわかりません。
ありがとう、ディーン