如何在Java8上自定义TCP / IP(非HTTP)TLS的主机名检查?

时间:2017-10-24 04:13:05

标签: java ssl tcp

我正在使用Java SE 8。

当我连接TLS(TCP / IP)服务器时,我想控制(自定义)主机名检查逻辑。例如,仅在主机名匹配时才接受,或者始终匹配而不进行任何检查。 对于HTTP,我可以使用HttpsURLConnection' setHostnameVerifier()方法。

https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/HttpsURLConnection.html#setHostnameVerifier-javax.net.ssl.HostnameVerifier-

我想在TCP / IP而不是HTTP上做类似的事情。例如,TCP / IP TLS上的MQTT(S)。

我已阅读以下网站,但我无法获得有用的信息。

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SettingHostnameVerifier

有没有方便的方法呢?

编辑2017/10/24

有些评论表明TCP / IP不会对待主机名。 真正。我应该重新解释一下我的问题。

更新的问题是"如何在连接目标的主机名和服务器证书的主机名之间编写检查主机名功能?"

使用getByName()获取连接目标IP地址。 https://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#getByName-java.lang.String-

1 个答案:

答案 0 :(得分:0)

通过HandshakeCompletedListener获取SSLSocket或在连接后从subjectDN获取内联,从会话中获取对等证书,从中获取{{1}}证书,并根据您认为连接的主机名进行检查。如果其中任何一个失败,请关闭连接。