コードを投稿していないので、実際に何をしたのかわかりません。SSLContext
ただし、カスタムX509TrustManager
サブクラスのみを使用して設定していると想定します。それは問題ありませんが、カスタムのトラストマネージャーの実装を組み込みのトラストマネージャーにチェーンさせることもできます。これは、トラストマネージャーの設定中に行うことができます。このようなものが機能するはずです:
private List<X509TrustManager> trustManagers = new ArrayList<X509TrustManager>();
public MyCustomTrustManager() {
TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmFactory.init((KeyStore)null);
for (TrustManager tm : tmFactory.getTrustManagers()) {
if (tm instanceof X509TrustManager)
trustManagers.add((X509TrustManager)tm);
}
}
これで、カスタムのトラストマネージャーにすべての組み込みのトラストマネージャーのリストが表示されます。のオーバーライドではcheckServerTrusted()
、組み込みの信頼マネージャーをループし、それぞれを順番に呼び出して、それぞれをチェックする必要がありcheckServerTrusted()
ます。いずれも証明書を信頼していない場合は、独自の証明書チェックを適用できます。それが通過すれば、あなたは普通に戻ることができます。そうでない場合は、他の方法と同じようにを投げCertificateException
ます。
編集:ホスト名の検証などを行うことについて、以下を追加します。
証明書のホスト名が期待どおりであることを確認することもできます。カスタムトラストマネージャーのコンストラクターに有効なホスト名を渡して、クラスに格納する必要があります。メソッドcheckServerTrusted()
には、の配列が渡されX509Certificate
ます。多くの「チェーン」は1つの証明書のみで構成されますが、cAが証明書に署名した方法に応じて、複数の「チェーン」が含まれる場合もあります。いずれにせよ、アレイの最初の証明書は、比較する「あなたの」証明書である必要があります。
トラストマネージャーを使用して基本的な証明書の有効性を確認したら、次のようにします。
Principal subjectDN = chain[0].getSubjectDN();
String subjectCN = parseDN(subjectDN.getName(), "CN");
if (this.allowedCN.equals(subjectCN)) {
// certificate is good
}
の実装はparseDN()
あなたに任されています。 subjectDN.getName()
キーと値のペアのコンマ区切りのリスト(で区切る)を返します。=
たとえば、C=US,ST=California,L=Mountain View,O=Google Inc,CN=www.google.com
。ホスト名の比較にはCN(「共通名」)値が必要です。ワイルドカード証明書がある場合は、のようなものとしてリストされる*.example.com
ため、その場合は単純な等しい一致以上のことを行う必要があることに注意してください。