检查给定端口是否在Java中使用TLS的最有效方法是什么?

检查给定端口是否在Java中使用TLS的最有效方法是什么?,java,ssl,tcp,tls1.2,Java,Ssl,Tcp,Tls1.2,我知道,通过启动一个完整的TLS握手,您可以验证连接,我想要的是有没有任何有效的方法,即发送更少的数据包来检查给定端口是否讲TLS。我正在初始化一个客户端,如果服务器不讲TLS,则需要快速使用非TLS客户端。您应该能够通过向服务器发送TLS ClientHello消息来使用普通TCP/IP套接字和探测器。如果服务器使用有效的TLS ServerHello进行响应,则可以合理地假设服务器使用TLS 然而,如果您的目标是尝试TLS,然后退回到非TLS,那么真正尝试与TLS连接可能比探索更好 如果一

我知道,通过启动一个完整的TLS握手,您可以验证连接,我想要的是有没有任何有效的方法,即发送更少的数据包来检查给定端口是否讲TLS。我正在初始化一个客户端,如果服务器不讲TLS,则需要快速使用非TLS客户端。您应该能够通过向服务器发送TLS ClientHello消息来使用普通TCP/IP套接字和探测器。如果服务器使用有效的TLS ServerHello进行响应,则可以合理地假设服务器使用TLS

然而,如果您的目标是尝试TLS,然后退回到非TLS,那么真正尝试与TLS连接可能比探索更好

  • 如果一个真正的客户端TLS堆栈得到一个无意义的响应,它应该立即关闭连接并引发异常。这应该和TLS探测器的尝试一样快

  • 另一方面,如果发送探测并获得有效的TLS响应,那么接下来需要做的就是使用客户端TLS堆栈进行连接。这又是一个克利恩瑟罗。因此,事实上,通过探测,您将使您的用例花费更多的时间,而不是更少的时间

参考:


我认为最有效的方法是发送一个ClientHello,其中包含一个没有人支持的密码套件:ciphersuite
TLS\u RSA\u WITH_NULL\u MD5={0x00,0x01}
。服务器应以您可以验证的TLS握手失败警报进行响应