質問

KeyToolを使用して、サーバーとクライアント認証を使用してWebサービスを実装しました。問題は、ホストの名前が含まれていない場合、この認証が機能しないことです。例えば:

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"

しかし、私は必要ありませんし、ホストやIPによる検証が好きではありません。それを避ける方法はありますか?

ありがとう。

役に立ちましたか?

解決

SSLには、ITの要件の一部として、証明書CNが接続しているホスト名と一致するという検証があります。 CNが一致しない場合、ブラウザは間違ったホストとオブジェクトに接続していると想定します。

これを回避する方法はありません。

他のヒント

私は他のポスターに同意します:あなたがSSLを使用している場合、あなたはほぼ確実です 欲しいです SSLセキュリティ機能セットの一部としてのホスト名確認。

とはいえ、あなたが使用しているクライアントによっては、この問題を回避する方法が非常にあるかもしれません。エンジニアは、テスト環境でのホスト名検証を回避します。デバッグ、プロトタイピングなど。httpsurlconnectionを介して接続するJavaクライアントを使用している場合、クライアントクラスに次のように追加するのと同じくらい簡単です。

static {
    HttpsURLConnection.setDefaultHostnameVerifier( 
        new HostnameVerifier(){
            public boolean verify(String string,SSLSession ssls) {
            return true;
        }
    });
}

SSL/TLSを使用するポイントは、クライアントが実際のものになりすまそうとしているいくつかの偽のサービスではなく、適切なサービスに接続していることを確認できるようにすることです。 (仮説的に)サーバー証明書にホスト識別情報が含まれていない場合、それが交渉していたサーバーが正しいものであった場合、クライアントにクライアントが含まれていました。

実際、あなた 検証が必要です DNSアドレスによって、SSLの検証が価値がないためです。 (または、少なくとも、それが可能な限り安全な場所はどこにもありません。)

理論的には、SSL/TLS以外のいくつかの手段で保護されているチャネルでクライアント/サーバー通信を実行しようとすることができると思います。ただし、Javaのセキュリティおよび暗号化技術に関する真剣な専門知識が必要です。

標準ロジックは次のとおりです。データを保護する必要がない場合は、SSLを使用しないでください。あなたがそれを保護する必要がある場合、あなたはあなたが接続しているホストを知る必要があります。その間はないはずです。

ただし、一部の内部環境では、ネットワークを十分に制御し、心配しないように設定する場合があります。

後者の場合、ソリューションは使用しているクライアントライブラリに依存します。 HTTPクライアントを使用している場合は、 SSL Config Guide. 。自分のものを実装する必要がないかもしれません SecureProtocolSocketFactory ただ使用できます EasySslProtocolsocketFactory.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top