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

时间:2019-06-03 15:14:01

标签: 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: No subject alternative DNS name matching somedomain.com found。这是因为在每个后续请求中,SSL握手都会发送到IP,而不是主机名,并获得托管公司的证书。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

希望这对某人有帮助:)