java - 如何使用主机名 validator ?

标签 java security ssl handshake

我现在正在使用 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。但在这种情况下,这整件事的目的是什么?
然而大多数情况下在互联网上冲浪当我遇到返回原始“真”的解决方案时(没有对参数进行任何处理)。

所以我很困惑应该何时、为何以及如何使用它。

你能详细说明一下吗?

最佳答案

From security(like man in the middle attack) point of view I think it must return false all the time.

几乎正确。仅当默认验证检测到问题时才调用此方法。在几乎所有情况下,此类问题都意味着应该中止连接以确保其安全。

However surfing on the internet most of the time I come accross solutions that return a raw 'true' (without any work on the arguments).

这几乎每次都是错误的。此类代码的作者通常不理解其中的含义(正如您正确所说的那样可能是 MITM),只是希望他们的代码能够以某种方式工作。是的,它会起作用,但它也会在不应该起作用的时候起作用,即它是不安全的。

默认验证失败的典型原因是服务器未正确配置错误的证书或使用错误的主机名(即不是证书中的主机名)访问服务器。

So its confusing to me when,why and how should I use it.

只有当您知道主机正在返回主题错误的证书时,您才应该使用它,但您也知道确切的错误所在并且会在您的实现中正确验证这种期望。

当然,最好不要解决所有访问服务器的应用程序,而是解决真正的问题。根据问题的真正原因,这通常意味着修复服务器上的证书或修复用于访问服务器的主机名。

关于java - 如何使用主机名 validator ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58569380/

相关文章:

javascript - 为什么浏览器限制在 Canvas 中使用来自其他域的图像?

java - Google Drive 更新时 GCM 通知?

java - 如何将文件夹添加到类路径?

windows - 如何制作安全的在线编译器?

security - 如何自己测试 "UDP header incorrect length"?

security - SilverStripe 3.1.x https - 是否有用于为共享 SSL 设置安全基本 URL 的配置选项?

java - request.setcharacterencoding() 方法似乎在源代码中没有执行任何操作

java - 是否可以使 Optional<T> 和 @Lazy 在 Spring 中协同工作?

c# - 在 ASP.NET Core 数据保护 API 中更改证书指纹

android - 如何为 Google 广告请求的 SSL 跟踪配置 Charles 代理?