如何减少ssl握手的等待时间?

时间:2012-07-18 22:19:25

标签: java networking network-programming sslhandshakeexception

我有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握手不会成功的最短时间。

2 个答案:

答案 0 :(得分:5)

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

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

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

  1. SSL证书不会“启用加密”。它主要用于身份验证。它还在通向会话密钥的握手中扮演次要的,不重要的角色。

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

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

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

  5. 不要依赖那些未经审查的未经审查的网站。使用官方产品文档。

答案 1 :(得分:1)

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

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