【问题标题】:HostnameVerifier vs TrustManager?HostnameVerifier vs TrustManager?
【发布时间】:2014-06-28 18:45:24
【问题描述】:

在什么情况下会在 Java 中使用 HostnameVerifier 而不是 TrustManager?一个比另一个推荐吗?查看 Java 文档(Interface HostnameVerifierInterface TrustManager),我不知道什么时候最好使用它们(尽管 TrustManager 似乎更通用)。

过去,我一直使用自定义TrustManager。但是,我注意到Heartbleed exploit in java 两者都使用(但我认为它不正确)。

编辑:当使用HostnameVerifier 时,是否执行了其他常规的 X509 检查,例如路径构建以及过期和撤销(如果已配置)?我想我本质上是在问HostnameVerifier 是否补充了其他检查(而不是替换它们)。

例如,假设开发服务器位于dev.example.com,并且由内部 CA 签名。 dev.example.com 的证书中有一个 DNS 名称,它的 dev.example.com。此外,假设我以192.168.1.10 连接到它。我可以使用HostnameVerifier 来允许dev.example.com192.168.1.10 吗?在这种情况下,是否允许使用附加名称​​并且是否执行其他常规 X509 检查?

【问题讨论】:

    标签: java ssl https jsse


    【解决方案1】:

    在什么情况下会在 Java 中使用 HostnameVerifier 而不是 TrustManager?

    从来没有。他们做不同的事情。 TrustManage 将证书作为 SSL 的一部分进行身份验证。 HostnameVerifier 将主机名作为 HTTPS 的一部分进行验证。他们没有竞争。

    推荐一个优于另一个?

    没有。

    编辑

    • TrustManager 在 TLS 握手期间运行。如果它指示失败,则握手中止并且连接失败。
    • HostnameVerifier 在 TLS 握手之后运行,通过从 TLS 角度来看已经有效的 TLS 连接,所以此时您知道证书是有效的,由受信任的发行者、未过期的 (?) 等,您所要做的就是确定 (a) 是否来自正确的服务器,以及 (b) 您是否信任该服务器。您可能会 (b) 在 TrustManager, 内执行此操作,但更常见的是您根本不会提供自己的 TrustManager

    【讨论】:

    • 感谢 EJP。所以我很清楚:TrustManager 不能用于覆盖 checkServerTrusted 中的主机名不匹配?
    • @jww 我没这么说。我说没有任何情况下你会更喜欢其中一个。 TrustManager 是 TLS 的一部分; HostnameVerifier 是 HTTPS 的一部分。他们不参加比赛。如果需要,您可以在 TrustManager 中验证主机名:请参阅 Javadoc,但您这样做是出于不同的原因,在不同的 RFC 下,在不同的通信阶段。
    • @FD_JSSE 实现了 RFC 2246 和后续版本,在实现时不需要主机名验证。 SSL/TLS 只承诺提供消息保密性+完整性和身份验证。授权始终取决于应用程序层,在本例中为 HTTP。即使在 18 年后,这个设计对我来说仍然非常明智。
    猜你喜欢
    • 2012-03-12
    • 2018-08-26
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多