3

SSL 経由で Web サービスを呼び出す Android アプリケーションがあります。本番環境では、信頼できる CA によって署名された通常の SSL 証明書を使用します。ただし、自己署名証明書 (独自の CA によって署名されたもの) をサポートできる必要があります。

自己署名証明書を受け入れるという提案されたソリューションを正常に実装しましたが、中間者攻撃のリスクがあるため、これは機能しません。次に、証明書チェーンが実際に CA によって署名されていることを検証する trustmanager を作成しました。

問題は、通常の SSL 検証をバイパスする必要があることです。アプリケーションは、自己署名証明書の 1 つがインストールされているサーバーとのみ通信します。

私は少し迷っています。広範囲にグーグル検索しましたが、何も見つかりません。CA をデバイスのトラスト ストアにプログラムで追加する方法を見つけたいと思っていました。

達成したいこと: 1. 通常の SSL 証明書の完全な標準サポート。2. 独自の CA によって署名された自己署名証明書の追加サポート。

何かアドバイス?

4

1 に答える 1

2

コードを投稿していないので、実際に何をしたのかわかりません。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ため、その場合は単純な等しい一致以上のことを行う必要があることに注意してください。

于 2012-10-31T06:36:24.923 に答える