是否可以强制 SSLHandshake 始终使用主机名,而不是 HttpsUrlConnection 的 IP
Is it possible to force SSLHandshake to always use the hostname, not IP for HttpsUrlConnection
所以我遇到了这种情况:我尝试使用 HTTPS 从 somedomain.com 下载图像。该域可能配置错误,但不幸的是我无法更改它。究竟发生了什么:
当我浏览到 https://somedomain.com/animage.jpg I get a valid certificate issued for somedomain.com, which is perfect. But when I call the same site using it's IP address, say https://123.123.123.123 时 - 我获得了 *.hostingcompany.com 的(也是有效的)证书 - 托管公司的证书。
现在,我尝试使用 Java 的 HttpsUrlConnection
下载文件的内容,没什么特别的:
var urlConnection = new URL(imageUrl).openConnection();
((HttpURLConnection) urlConnection).getResponseCode();
(我想先查看响应码,这里不重要)
此代码 运行 位于 Spring 引导应用程序中,并且 运行 应要求提供。自启动应用程序以来,它对 first 请求工作正常。每个后续请求都失败并返回 java.security.cert.CertificateException: No subject alternative DNS name matching somedomain.com found
。这是因为在每个后续请求中,SSL 握手都会发送到 IP,而不是主机名,并获得托管公司的证书。
我试图为 SSL 类 寻找不同的设置,但无济于事。我知道有一个解决方法,我可以提供我自己的 HostnameVerifier
,它可能 return 是真的,但那不安全,所以我不想那样做。
有人遇到过这样的问题吗?也许我在错误的地方搜索?也许是 DNSes 的问题?我将不胜感激任何帮助。
原来这是 Java 11.01 中的错误。自 11.02 起已修复。切换到 11.03 后。我上面描述的行为消失了。每个请求都会获得适当的证书。
所以我遇到了这种情况:我尝试使用 HTTPS 从 somedomain.com 下载图像。该域可能配置错误,但不幸的是我无法更改它。究竟发生了什么:
当我浏览到 https://somedomain.com/animage.jpg I get a valid certificate issued for somedomain.com, which is perfect. But when I call the same site using it's IP address, say https://123.123.123.123 时 - 我获得了 *.hostingcompany.com 的(也是有效的)证书 - 托管公司的证书。
现在,我尝试使用 Java 的 HttpsUrlConnection
下载文件的内容,没什么特别的:
var urlConnection = new URL(imageUrl).openConnection();
((HttpURLConnection) urlConnection).getResponseCode();
(我想先查看响应码,这里不重要)
此代码 运行 位于 Spring 引导应用程序中,并且 运行 应要求提供。自启动应用程序以来,它对 first 请求工作正常。每个后续请求都失败并返回 java.security.cert.CertificateException: No subject alternative DNS name matching somedomain.com found
。这是因为在每个后续请求中,SSL 握手都会发送到 IP,而不是主机名,并获得托管公司的证书。
我试图为 SSL 类 寻找不同的设置,但无济于事。我知道有一个解决方法,我可以提供我自己的 HostnameVerifier
,它可能 return 是真的,但那不安全,所以我不想那样做。
有人遇到过这样的问题吗?也许我在错误的地方搜索?也许是 DNSes 的问题?我将不胜感激任何帮助。
原来这是 Java 11.01 中的错误。自 11.02 起已修复。切换到 11.03 后。我上面描述的行为消失了。每个请求都会获得适当的证书。