如何缩短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握手不会成功的合适的最短时间是多少。
'连接超时'与握手或甚至SSL无关。调用startHandshake()时不会发生这种情况:它在您创建套接字时发生。你的堆栈跟踪会告诉你。
为了减少它,使用默认的构造函数创建一个Socket();调用connect(SocketAddress地址,超时);那么如果成功调用SSLSocketFactory.createSocket(Socket,...)将其包装在SSLSocket中。
注意你引用的博客的质量确实很差。它的一些问题:
SSL证书不'启用加密'。它主要用于身份验证。它在通向会话密钥的握手中也起着次要的,不重要的作用。例如,TLS提供的不仅仅是“防止窃听,篡改和伪造消息”:它还可以防止重播和中间人攻击;例如,它提供了更多的加密可能性,而不仅仅是带有1024或2048字节密钥的RSA。
建议'在浏览器级别,它只意味着浏览器验证了服务器的证书',并且为了安全性,用户/应用程序必须'使用证书中包含的公钥来加密某些东西,并确保服务器可以理解它是完全废话。在SSL握手期间,浏览器已经通过数字签名机制检查到服务器拥有该证书。
所有这些:“锁定的挂锁”图标与服务器的URL,DNS名称或IP地址没有任何关系 - 这是一种常见的误解。只有在服务器证书本身指定了URL,名称或地址时,才能安全地建立这种绑定。 '完全不正确。 HTTPS 包括根据证书中嵌入的内容检查主机名:嵌入证书的内容放在那里并由签名机构检查。
不要依赖像这样未经审查的未经审查的网站。使用官方产品文档。
Greate Answer居然!! 1谢谢太多 – 2013-09-12 08:55:50
无论如何,你应该在一个线程中这样做,所以你不必等待握手。 SSLSocket提供'addHandshakeCompletedListener'方法。 – Falmarri 2012-07-18 22:29:46
[SSL连接超时和读超时]的可能重复(http:// stackoverflow。com/questions/7734188/ssl-connection-timeout-and-read-timeouts) – 2012-07-18 22:31:51
socket的setSoTimeout()方法如何? – peshkira 2012-07-18 22:32:49