3

http://sanjaal.com/java/tag/get-public-key-of-ssl-certificate-in-java/から、ソケットを作成して ssl ハンドシェイクを開始する次のコードがあります。

SSLSocketFactory factory = HttpsURLConnection
.getDefaultSSLSocketFactory();

System.out.println("Creating a SSL Socket For "+hostname+" on port "+port);

SSLSocket socket = (SSLSocket) factory.createSocket(hostname, port);

socket.startHandshake();
System.out.println("Handshaking Complete");

問題は、ハンドシェイクが確立できなかった場合、次の例外が表示されるまでに長い待ち時間があることです: 接続がタイムアウトしました

最大待機時間を設定するにはどうすればよいですか? SSLハンドシェイクが成功しないことを保証する適切な最小時間はどれくらいですか.

4

2 に答える 2

6

「接続タイムアウト」は、ハンドシェイクや SSL とは関係ありません。startHandshake() を呼び出すときは発生しません。ソケットを作成するときに発生します。あなたのスタックトレースはあなたにそれを伝えたでしょう。

これを減らすには、デフォルトのコンストラクターを使用して Socket() を作成します。connect(SocketAddress アドレス、長いタイムアウト) を呼び出します。それが成功した場合は、SSLSocketFactory.createSocket(Socket, ...) を呼び出して SSLSocket にラップします。

注意:あなたが引用したブログは、実に質の悪いものです。それに関するいくつかの問題:

  1. SSL 証明書は「暗号化を有効にする」ものではありません。主に認証のために存在します。また、セッション キーにつながるハンドシェイクにおいて、重要ではない重要な役割も果たします。

  2. TLS は、「盗聴、改ざん、およびメッセージの偽造を防止する」だけではありません。たとえば、リプレイや中間者攻撃も防止します。また、1024 または 2048 バイトのキーを使用する RSA よりも多くの暗号化の可能性を提供します。

  3. 「ブラウザレベルでは、ブラウザがサーバーの証明書を検証したことを意味するだけである」という提案と、セキュリティのために、ユーザー/アプリケーションは「証明書に含まれる公開鍵を使用して何かを暗号化し、サーバーがそれを理解できることを保証する必要がある」 」は完全にナンセンスです。ブラウザーは、SSL ハンドシェーク中に、デジタル署名メカニズムを介して、サーバーがその証明書を所有していることを既に確認しています。

  4. 「ロックされた南京錠」アイコンは、サーバーの URL、DNS 名、または IP アドレスとは何の関係もありません。そうでないと考えるのはよくある誤解です。このようなバインディングは、サーバーの証明書自体に URL、名前、またはアドレスが指定されている場合にのみ、安全に確立できます。' は完全に間違っています。HTTPSには、証明書に埋め込まれているものに対してホスト名をチェックすることが含まれます。証明書に埋め込まれているものはそこに置かれ、署名機関によってチェックされます。

そのような未審査の未審査のサイトに頼らないでください。公式の製品ドキュメントを使用してください。

于 2012-07-18T22:38:56.643 に答える
1

sslSocket.startHandshake(); を実行する前に sslSocket.setSoTimeout(タイムアウト); を使用します。

setSoTimeout は読み取りタイムアウトであるため、setSoTimeout で指定したタイムアウト値はハンドシェイクでも機能します。

于 2014-07-30T10:00:12.150 に答える