この質問と同様の問題に直面しているようですnull
.trustmanagerパラメーターを使用SSLContext.init(...)
するとデフォルトのトラストマネージャーに戻りますが、キーマネージャーには戻りません.
そうは言っても、デフォルトのシステム プロパティを使用して KeyManager を初期化するのはそれほど難しくありません。このようなものは機能するはずです(コードはこの回答に直接記述されているため、いくつかの小さな修正が必要になる場合があります):
String provider = System.getProperty("javax.net.ssl.keyStoreProvider");
String keystoreType = System.getProperty("javax.net.ssl.keyStoreType", KeyStore.getDefaultType());
KeyStore ks = null;
if (provider != null) {
ks = KeyStore.getInstance(keystoreType, provider);
} else {
ks = KeyStore.getInstance(keystoreType);
}
InputStream ksis = null;
String keystorePath = System.getProperty("javax.net.ssl.keyStore");
String keystorePassword = System.getProperty("javax.net.ssl.keyStorePassword");
if (keystorePath != null && !"NONE".equals(keystorePath)) {
ksis = new FileInputStream(keystorePath);
}
try {
ks.load(ksis, keystorePassword.toCharArray());
} finally {
if (ksis != null) { ksis.close(); }
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, keystorePassword.toCharArray());
// Note that there is no property for the key password itself, which may be different.
// We're using the keystore password too.
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), ..., null);
(このユーティリティ クラスも、より具体的には興味深いものになる可能性がありますgetKeyStoreDefaultLoader()
。)
編集:(追加のコメントに続いて)
の半分だけをカスタマイズしたい場合、Oracle と IBM JSSE の両方にデフォルトの動作がないように思われますSSLContext
。Oracle JSSE ドキュメントのリンク先のセクションには、「キーストアが javax.net.ssl.keyStore システム プロパティと適切な javax.net.ssl.keyStorePassword システム プロパティによって指定されている場合、KeyManager はデフォルトの SSLContext によって作成されます。これは、指定されたキーストアを管理するための KeyManager 実装になります。」 これは実際にはここでは当てはまりません。なぜなら、SSLContext
(その一部をカスタマイズしている場合でも) デフォルトのものではなくカスタムを使用しているためです。
いずれにせよ、Oracle JSSE リファレンス ガイドと IBM JSSE リファレンス ガイドは、この件に関して異なります。(これがどれだけ「標準」であることを意味しているのか、そして原則として一方が他方に準拠するべきかどうかはわかりませんが、明らかにそうではありません。)
両方の「オブジェクトの作成SSLContext
」セクションはほとんど同じですが、異なります。
Oracle JSSEリファレンスガイドには次のように書かれています:
KeyManager[] パラメータが null の場合、空の KeyManager がこのコンテキストに対して定義されます。
IBM JSSE リファレンス ガイドには次のように書かれています。
KeyManager[] パラメータが null の場合、インストールされているセキュリティ プロバイダが検索され、KeyManagerFactory の最も優先度の高い実装が検索され、そこから適切な KeyManager が取得されます。
残念ながら、仕様が異なる実装間で同じ動作が必要な場合は、実装の 1 つが既に行っていることを効果的に複製することになるとしても、少しコードを記述する必要があります。