ssl 如何使用HostnameVerifier?

wooyq4lh  于 2023-06-23  发布在  其他
关注(0)|答案(3)|浏览(187)

我现在正在使用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
        }
    };

从安全性的Angular 来看(就像中间人攻击),我认为它必须始终返回false,但在这种情况下,这整个事情的目的是什么?
然而,在网上冲浪的大部分时间,我遇到的解决方案,返回一个原始的'真'(没有任何工作的论点)。
所以我很困惑,什么时候,为什么以及如何使用它。
你能详细说明一下吗?

2uluyalo

2uluyalo1#

从安全性(就像中间人攻击)的Angular 来看,我认为它必须总是返回false。
几乎正确。只有在默认验证检测到问题时才调用此方法。在几乎所有的情况下,这样的问题意味着连接应该被中止以保持安全。
然而,在网上冲浪的大部分时间,我遇到的解决方案,返回一个原始的'真'(没有任何工作的论点)。
这几乎每次都是错误的。这种代码的作者通常不理解其中的含义(可能是MITM,正如您正确地说的那样),只希望他们的代码以某种方式工作。是的,它会工作,但它也会工作时,它不应该工作,即。它是不安全的。
默认验证失败的典型原因是服务器配置错误,证书不正确,或者服务器使用错误的主机名访问(即而不是证书中的那个)。
所以我很困惑,什么时候,为什么以及如何使用它。
只有当您知道主机返回的证书主题错误时,才应该使用它,但您也知道错误的确切原因,并将在实现中正确验证此预期。
当然,最好不要在访问服务器的所有应用程序中进行变通,而是解决真实的的问题。根据问题的真实的原因,这通常意味着要么修复服务器上的证书,要么修复用于访问服务器的主机名。

3okqufwl

3okqufwl2#

检查会话主机是否是我们所期望的。

public boolean verify(String hostname, SSLSession session) {
   return hostname.equals(session.getPeerHost());
}
h22fl7wq

h22fl7wq3#

如果你只是想让系统信任一个特定的证书来代替预期的主机名,你可以尝试下面的代码(Kotlin):

return if (hostname == "proxy.example.com") { // the host that is being connected to over TCP
                val cert = session.peerCertificates[0] as? X509Certificate ?: return false
                cert.subjectAlternativeNames.contains(listOf(2, "subject.example.com")) // the certificate that is being served
            } else {
                false
            }

对于一些只使用CN标识(不使用SAN)的旧证书来说,它是不起作用的,但是修复起来很简单。

相关问题