【问题标题】:How to customize hostname checking for TCP/IP (not HTTP) TLS on Java8?如何在 Java8 上自定义 TCP/IP(不是 HTTP)TLS 的主机名检查?
【发布时间】:2018-04-04 18:03:00
【问题描述】:

我正在使用 Java SE 8。

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

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

一些 cmets 表明 TCP/IP 不处理主机名。 真的。我应该改写我的问题。

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

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

【问题讨论】:

    标签: java ssl tcp


    【解决方案1】:

    在连接后通过HandshakeCompletedListener 或从SSLSocket 内联获取SSLSession,从会话中获取对等证书,从证书中获取subjectDN,并根据主机名检查它你以为你正在连接到。如果其中任何一个失败,请关闭连接。

    【讨论】:

    • 感谢您的回答!我达到了我的目标。我对 HTTP 层提供 HostnameVerifier 感到困惑,所以我猜测可能存在类似的底层功能。现在我明白它不存在了。
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多