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

Java 如何减少ssl握手的等待时间?,java,networking,network-programming,sslhandshakeexception,Java,Networking,Network Programming,Sslhandshakeexception,我有以下代码,用于创建套接字并启动ssl握手 SSLSocketFactory factory = HttpsURLConnection .getDefaultSSLSocketFactory(); System.out.println("Creating a SSL Socket For "+hostname+" on port "+port); SSLSocket socket = (SSLSocket) factory.createSocket(hostname, port); so

我有以下代码,用于创建套接字并启动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无关。调用startAndShake()时不会发生这种情况:它发生在创建套接字时。你的堆栈跟踪会告诉你的

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

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

  • SSL证书不“启用加密”。它主要用于身份验证。它在会话密钥前的握手中也起着次要的、不重要的作用

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

  • “在浏览器级别,这只意味着浏览器已经验证了服务器的证书”,并且为了安全起见,用户/应用程序必须“使用证书中包含的公钥对某些内容进行加密,并确保服务器能够理解”的建议完全是胡说八道。在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");
    
  • 所有这些:“锁定的挂锁”图标与服务器的URL、DNS名称或IP地址没有任何关系——否则的想法是一种常见的误解。只有在服务器证书中指定了URL、名称或地址时,才能安全地建立这种绑定。”这是完全错误的。HTTPS包括根据证书中嵌入的内容检查主机名:证书中嵌入的内容放在那里并由签名机构检查


  • 不要依赖那些未经推荐的网站。在执行sslSocket.startHandshake()之前,请使用官方产品文档。

    ;使用sslSocket.setSoTimeout(超时)


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

    无论如何,您都应该在线程中执行此操作,因此不必等待握手。SSLSocket提供了
    addHandshakeCompletedListener
    方法。socket的setotimeout()方法是否可能重复?@EJP无所谓,对于初始握手,提到的超时选项确实有效
    socket.startHandshake()
    将抛出一个异常(已测试的jdk8)@user207421如果我们创建一个如下的服务器套接字,我们如何设置超时<代码>SSLServerSocket套接字=(SSLServerSocket)工厂。createServerSocket(端口,0,bindAddress)socket.setSoTimeout(超时)它也适用于握手吗
    clientSocket=serverSocket.accept();((SSLSocket)clientSocket).startAndShake()