如何缩短ssl握手的等待时间?

问题描述:

我从http://sanjaal.com/java/tag/get-public-key-of-ssl-certificate-in-java/下面的代码创建一个套接字并启动ssl握手。如何缩短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握手不会成功的合适的最短时间是多少。

+0

无论如何,你应该在一个线程中这样做,所以你不必等待握手。 SSLSocket提供'addHandshakeCompletedListener'方法。 – Falmarri 2012-07-18 22:29:46

+0

[SSL连接超时和读超时]的可能重复(http:// *。com/questions/7734188/ssl-connection-timeout-and-read-timeouts) – 2012-07-18 22:31:51

+0

socket的setSoTimeout()方法如何? – peshkira 2012-07-18 22:32:49

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

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

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

  1. SSL证书不'启用加密'。它主要用于身份验证。它在通向会话密钥的握手中也起着次要的,不重要的作用。例如,TL​​S提供的不仅仅是“防止窃听,篡改和伪造消息”:它还可以防止重播和中间人攻击;例如,它提供了更多的加密可能性,而不仅仅是带有1024或2048字节密钥的RSA。

  2. 建议'在浏览器级别,它只意味着浏览器验证了服务器的证书',并且为了安全性,用户/应用程序必须'使用证书中包含的公钥来加密某些东西,并确保服务器可以理解它是完全废话。在SSL握手期间,浏览器已经通过数字签名机制检查到服务器拥有该证书。

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

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

+0

Greate Answer居然!! 1谢谢太多 – 2013-09-12 08:55:50

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

setSoTimeout是一个读取超时值,因此您在setSoTimeout中提供的超时值也将与握手一起使用。

+0

设置读取超时。这是连接超时。 – EJP 2017-06-29 19:44:31

+0

@EJP无所谓,对于初始握手,提到的超时选项确实有效。 'socket.startHandshake()'会抛出一个异常(测试jdk8) – benez 2017-08-16 18:52:21