5

現在、HTTPSWebサーバーの自己署名証明書を持っています。

私のJavaプログラムには、Webサーバーへのソケットを作成するSSLSocketFactoryがあります。sunのデフォルトの実装は、自己署名証明書をブロックします。X509TrustManagerの独自の実装では、証明書の日付が有効かどうかしか確認できません。

デフォルトの実装に有効性(日付とホスト名など)をチェックさせ、ユーザーにこの証明書を受け入れさせるためのダイアログが表示されない場合は、可能性はありますか?

これまでに見つけた各コードは、SSLチェックを無効にするだけで、無効な証明書をすべて受け入れました。

4

1 に答える 1

1

私は実際にこれを試したことはありませんが、独自の信頼マネージャーを実装できないのはなぜですか。これは、最初にデフォルトの信頼マネージャーに委任して、証明書が有効かどうかを確認し、そうでない場合は、ユーザーに証明書を受け入れるかどうかを尋ねます。 ?


デフォルト値を使用するために、null 引数を使用してほとんどのセキュリティ クラスを初期化できます。デフォルトのトラスト マネージャーを取得するには、使用可能なトラスト マネージャーを取得し、mgrs 配列の最初のトラスト マネージャーを選択してX509TrustManagerインターフェイスを実装する必要があります。通常、配列には 1 つの要素しか含まれません。

TrustManagerFactory trustmanagerfactory = 
     TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustmanagerfactory.init((KeyStore)null);
TrustManager[] mgrs = trustmanagerfactory.getTrustManagers();

デフォルトのトラスト マネージャーを独自の拡張機能でラップしたら、SSL コンテキストを初期化し、そこからソケット ファクトリを取得する必要があります。

SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, new TrustManager[] {myTm}, null);
SSLSocketFactory sf = sslContext.getSocketFactory();

次に、このソケット ファクトリを使用して新しいクライアント ソケットを作成するか、それを に渡してHttpsURLConnection.setDefaultSSLSocketFactory、独自のトラスト マネージャーで URL で https プロトコルを使用します。

于 2009-10-29T15:53:19.113 に答える