我现在正在尝试使用KeyManager和TrustManager进行SSL配置,除了HostNameVerifier部分对我来说一切似乎都很清楚。
我已阅读以下内容:
https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HostnameVerifier.html
https://lightbend.github.io/ssl-config/HostnameVerification.html
因此,基本上,当请求的URL和证书中的URL不匹配时,该命令才生效。
处理此问题的最佳做法是什么?
new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
// some code
}
};
从安全性(如中间攻击者)的角度来看,我认为它必须始终返回false。但是在这种情况下,这件事的目的是什么?
但是,大多数情况下,上网都是当我遇到返回原始“ true”(不对参数做任何工作)的解决方案时。
所以我在何时,为什么以及如何使用它时会感到困惑。
请详细说明吗?
答案 0 :(得分:1)
从安全性(就像中间攻击者一样)的角度来看,我认为它必须一直返回false。
几乎正确。仅当默认验证检测到问题时才调用此方法。在几乎所有情况下,此类问题都意味着应中止连接以保持其安全性。
无论如何,大多数时候我都会在互联网上冲浪,这些解决方案会返回原始的“ true”(对参数不做任何工作)。
这几乎是错误的。此类代码的作者通常不理解其含义(如您正确所说的可能是MITM),而只是希望他们的代码以某种方式工作。是的,它可以工作,但是在不安全的情况下也可以工作,即不安全。
默认验证失败的典型原因是服务器配置错误的证书不正确或使用错误的主机名(即不是证书中的主机名)访问服务器。
所以我在何时,为什么以及如何使用它时会感到困惑。
仅当您知道主机返回的主题错误时才应使用该证书,但您也知道究竟是什么错误,并将在实现中正确验证这一期望。
当然,最好不要在访问服务器的所有应用程序中都工作,而要解决实际问题。根据问题的真正原因,这通常意味着在服务器上固定证书或固定用于访问服务器的主机名。
答案 1 :(得分:1)
检查会话主机是否符合我们的预期。
public boolean verify(String hostname, SSLSession session) {
return hostname.equals(session.getPeerHost());
}