在什么情况下使用HostnameVerifier
而不是TrustManager
的Java?一个推荐超过另一个?查看Java文档(Interface HostnameVerifier和Interface 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.com
和192.168.1.10
吗?在这种情况下,允许的其他名称和是否会执行其他惯常的X509检查?
答案 0 :(得分:6)
在什么情况下,在Java中的TrustManager上使用HostnameVerifier?
从不。他们做不同的事情。 TrustManage将证书作为SSL的一部分进行身份验证。 HostnameVerifier验证主机名作为HTTPS的一部分。他们没有竞争。
推荐的是另一个吗?
没有
修改强>
TrustManager
运行。如果它指示失败,则中止握手并且连接失败。HostnameVerifier
运行,通过TLS连接从TLS的角度来看已经有效,所以此时您知道证书有效,签名由受信任的发行者,未过期的(?)等,你所要做的就是决定(a)它是来自正确的服务器,还是(b)你是否信任该服务器。您可以({)在TrustManager,
内进行,但更常见的是,您根本不提供自己的TrustManager
。