【问题标题】:Is it possible to force SSLHandshake to always use the hostname, not IP for HttpsUrlConnection是否可以强制 SSLHandshake 始终使用主机名,而不是 HttpsUrlConnection 的 IP
【发布时间】:2019-10-19 04:12:57
【问题描述】:

所以我遇到了这种情况:我尝试使用 HTTPS 从 somedomain.com 下载图像。该域可能配置错误,但不幸的是我无法更改它。到底发生了什么:

当我浏览到https://somedomain.com/animage.jpg 时,我获得了为 somedomain.com 颁发的有效证书,这是完美的。但是当我使用它的 IP 地址调用同一个站点时,比如说https://123.123.123.123 - 我得到了 *.hostingcompany.com 的(也是有效的)证书 - 托管公司的证书。

现在,我尝试使用 Java 的HttpsUrlConnection 下载文件的内容,没什么特别的:

var urlConnection = new URL(imageUrl).openConnection();
((HttpURLConnection) urlConnection).getResponseCode();

(我想先查看响应码,这里不重要。)

此代码在 Spring Boot 应用程序中运行,并根据请求运行。自启动应用程序以来,它适用于 first 请求。每个后续请求都以java.security.cert.CertificateException: No subject alternative DNS name matching somedomain.com found 失败。这是因为在每个后续请求中,SSL 握手都会发送到 IP,而不是主机名,并获取托管公司的证书。

我试图为 SSL 类找到不同的设置,但无济于事。我知道有一种解决方法,我可以提供自己的 HostnameVerifier,它可以返回 true,但这并不安全,所以我不想这样做。

有人遇到过这样的问题吗?也许我在错误的地方搜索?也许它与DNS有关?我将不胜感激。

【问题讨论】:

    标签: java ssl httpurlconnection sslhandshakeexception


    【解决方案1】:

    原来这是 Java 11.01 中的一个错误。自 11.02 起已修复。切换到 11.03 后。我上面描述的行为消失了。每个请求都会获得一个适当的证书。

    这里是错误的详细信息:https://bugs.openjdk.java.net/browse/JDK-8211806

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 2013-12-09
      • 2021-03-17
      • 2016-04-14
      • 2020-01-27
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多