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");

问题是,如果握手无法建立,在我看到异常之前有很长的等待时间:Connection timed out

如何设置最长等待时间?以及确保 ssl 握手不会成功的合适的最短时间是多少。

4

2 回答 2

6

“连接超时”与握手甚至 SSL 无关。当您调用 startHandshake() 时不会发生这种情况:它会在您创建套接字时发生。您的堆栈跟踪会告诉您这一点。

为了减少它,使用默认构造函数创建一个 Socket() ;调用connect(SocketAddress地址,长时间超时);然后如果成功调用 SSLSocketFactory.createSocket(Socket, ...) 将其包装在 SSLSocket 中。

注意你引用的博客质量确实很差。它的一些问题:

  1. SSL 证书不会“启用加密”。它主要用于身份验证。它还在导致会话密钥的握手中扮演一个次要的、无关紧要的角色。

  2. TLS 提供的不仅仅是“防止 [ing] 窃听、篡改和消息伪造”:例如,它还可以防止重放和中间人攻击;它提供了更多的加密可能性,而不仅仅是具有 1024 或 2048 字节密钥的 RSA。

  3. 建议“在浏览器级别,这仅意味着浏览器已经验证了服务器的证书”,并且为了安全起见,用户/应用程序必须“使用证书中包含的公钥加密某些内容并确保服务器可以理解它’完全是胡说八道。在 SSL 握手期间,浏览器已经通过数字签名机制检查了服务器是否拥有该证书。

  4. 所有这一切:“锁定的挂锁”图标与服务器的 URL、DNS 名称或 IP 地址无关——否则是一种常见的误解。只有在服务器证书本身中指定 URL、名称或地址时,才能安全地建立这种绑定。'是完全不正确的。HTTPS包括根据嵌入在证书中的内容检查主机名:嵌入在证书中的内容被放在那里并由签名机构检查。

不要依赖这样的未经审查的未经审查的网站。使用官方产品文档。

于 2012-07-18T22:38:56.643 回答
1

在执行 sslSocket.startHandshake() 之前;使用 sslSocket.setSoTimeout(timeout);

setSoTimeout 是读取超时,因此您在 setSoTimeout 中提供的超时值也适用于握手。

于 2014-07-30T10:00:12.150 回答