Java:ユーザーがSSL証明書を受け入れるようにするダイアログを表示する方法
-
10-07-2019 - |
質問
現在、HTTPS Webサーバー用の自己署名証明書を持っています。
私のJavaプログラムには、Webサーバーへのソケットを作成するSSLSocketFactoryがあります。 sunのデフォルトの実装は、自己署名証明書をブロックします。 X509TrustManagerの独自の実装では、証明書の日付が有効かどうかしか確認できません。
デフォルトの実装に有効性(日付とホスト名、...)をチェックさせ、ユーザーがこの証明書を受け入れることを許可するダイアログを表示できない場合、可能性はありますか?
これまで見つかった各コードは、SSLチェックのみを無効にし、無効な証明書をすべて受け入れました。
解決
実際にこれを試したことはありませんが、最初にデフォルトのトラストマネージャーに委任して証明書が有効かどうかを確認し、そうでない場合はユーザーにまだ確認するかどうかを尋ねる独自のトラストマネージャーを実装できないのはなぜですか証明書を受け入れますか?
デフォルト値を使用するために、ほとんどのセキュリティクラスを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プロトコルを使用します。