Java HttpSurlConnection的行为与HostnameVerifier和SSLSocketFactory的默认实现

Java HttpSurlConnection的行为与HostnameVerifier和SSLSocketFactory的默认实现,java,ssl,httpsurlconnection,Java,Ssl,Httpsurlconnection,我试图理解一段代码,它不会覆盖HttpsURLConnection的HostnameVerifier和SSLSocketFactory。当前的代码能够使SSL请求正常,这让我有点困惑。 HostnameVerifier和SSLSocketFactory类的默认实现是如何工作的?它是验证证书CA和主机名,还是同时绕过所有这些检查 另外,如果请求中包含localhost,是否有任何特殊行为? URL如下所示 :/ 谢谢你的帮助 它将根据JDKjre/lib/security/cacerts或任何您配

我试图理解一段代码,它不会覆盖HttpsURLConnection的HostnameVerifier和SSLSocketFactory。当前的代码能够使SSL请求正常,这让我有点困惑。 HostnameVerifier和SSLSocketFactory类的默认实现是如何工作的?它是验证证书CA和主机名,还是同时绕过所有这些检查

另外,如果请求中包含localhost,是否有任何特殊行为? URL如下所示
:/


谢谢你的帮助

它将根据JDK
jre/lib/security/cacerts
或任何您配置的可信存储中的可信CA证书检查CA证书

它还将检查链中的所有证书是否受信任,而不仅仅是直接签名者。默认情况下,它不会在线检查吊销的证书,但您可以在
java.security
策略文件中启用该功能

它还将根据证书检查主机名。
它支持附加CNs和通配符CNs

有关本地主机的扩展问题:

localhost
和其他主机名一样只是一个主机名。它必须列在证书中。但我想,你不会找到一个官方的CA来给你证书:-)

如果您想在本地主机上使用您的真实证书,您可以使用不同的主机名对其进行寻址。如果要运行
foo.bar.com
的证书,请将以下行添加到
hosts
文件(Win:
%WINDOWS%\system32\drivers\etc\hosts
,Unix
/etc/hosts
)中:

127.0.0.1 foo.bar.com
现在启动浏览器并连接到
https://foo.bar.com
。它将连接到本地服务器并发布SSL加密的HTTP请求。该请求包含URL中的主机名,而不是真正的主机名

我的意思过于简单:浏览器从服务器接收SSL证书,并将CN与它刚才调用的主机名进行比较。如果匹配,它将检查证书是否可信(不要在订单上给我下定单,也许它会先检查信任级别)

这里是失败的地方:服务器提供的证书不包含CN localhost,因此,客户端将中止连接。在您的情况下,客户端是HttpSSLrequest

为了让客户相信一切都很好,您可以做两件事: -伪造主机名,并在cacerts信任库中添加签名CA。 -实现一个主机名和证书验证器,让您通过


关于本教程,使用了自签名证书,您必须通过覆盖首次访问时的警告来说服浏览器接受它。

我应该寻找什么配置?我不确定JDK的默认信任存储设置在哪里。“它支持额外的CNs和通配符CNs。”。你所说的通配符CNs是什么意思。localhost是否被视为通配符CN?正在发送的请求使用本地主机,但服务器发回的证书中没有“localhost”。通配符证书包含星号并适用于此域的所有子域:
*.foo.com
适用于
bar.foo.com
baz.foo.com
等。如果您想玩localhost,将其添加到证书中。看看我的答案。非常感谢你的帮助。现在这很有道理。然而,我正在阅读这篇文章,其中有一点说,你应该能够连接使用。为什么localhost要在这里工作?证书上没有它的权利?客户端首先检查主机名。服务器最初只提供证书