java - 是否可以强制 SSLHandshake 始终使用主机名,而不是 HttpsUrlConnection 的 IP

标签 java ssl httpurlconnection sslhandshakeexception

所以我遇到了这种情况:我尝试使用 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 应用程序中运行,并根据请求运行。它适用于启动应用程序后的第一个 请求。每个后续请求都失败并显示 java.security.cert.CertificateException:找不到与 somedomain.com 匹配的主题备用 DNS 名称。这是因为在每个后续请求中,SSL 握手都会发送到 IP,而不是主机名,并获取托管公司的证书。

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

有人遇到过这样的问题吗?也许我在错误的地方搜索?也许是 DNSes 的问题?我将不胜感激任何帮助。

最佳答案

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

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

关于java - 是否可以强制 SSLHandshake 始终使用主机名,而不是 HttpsUrlConnection 的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56430190/

相关文章:

Android:Uri编码地名中的神秘转义单引号

java - openurlconnection 与 connect 之间的区别?

ssl - 如果我的网站使用 SSL,客户需要做些什么吗?

java - 需要帮助登录网站和检索信息

java - java中没有sizeof运算符。如何在java中找到对象的大小?

Java检查Windows上是否安装了程序

java - SnappyDB 的默认值

java - 确定给定 IP 是否为 Web 主机

ssl - TLS 1.2 change-cipher-spec 的 "decrypt error",但正确读取 MAC

ios - 在没有 ssl 证书的情况下在 WebView 中打开 Https URL