所以我有这种情况:我尝试使用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有关?我将不胜感激。
答案 0 :(得分:0)
原来这是Java 11.01中的错误。自11.02起已修复。切换到11.03之后。我上面描述的行为不见了。每个请求都会获得适当的证书。
以下是该错误的详细信息:https://bugs.openjdk.java.net/browse/JDK-8211806
希望这对某人有帮助:)