実際には、ハンドシェイク中に証明書が提示されるため、サーバーはそれ自体を識別でき、最終的にはクライアントも識別できます。
あなたがするとき:
SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
[...]
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
try {
socket.startHandshake();
socket.close();
} catch (SSLException e) {
e.printStackTrace(System.out);
}
startHandshake() で例外が発生しない場合は、証明書が何らかの理由で既に信頼されていることを意味します (キーストアに直接存在する、信頼されたエンティティによって署名されている)。
例外が発生したかどうかに関係なく、ダウンロードしたチェーンにアクセスできます。
X509Certificate[] chain = tm.chain;
if (chain == null) {
// error in downloading certificate chain
return;
}
// loop through chain
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
[....]
}
X509Certificate オブジェクト インスタンスを使用すると、実際に k-ieth キーストアを更新できます。
X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
[...]
ks.setCertificateEntry(alias, cert);
OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();
完全なサンプルについては、こちらをご覧ください。
または、信頼するサーバーの証明書をダウンロードする別のより安全な方法は、openssl コマンドを使用することです。
# openssl s_client -showcerts -connect $SERVER:$PORT 2>&1 | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >/tmp/$SERVERNAME.cert
次に、通常どおりインポートしkeytool
ます。