要创建安全套接字(客户端),您可以使用:
//An SSL socket can't be created from scratch. We need a Factory that
//handles the underlying logic that allows create a SSL socket
SocketFactory socketFactory = SSLSocketFactory.getDefault();
//Get the socket from the Factory
SSLSocket socket = (SSLSocket) socketFactory.createSocket(host, port);
现在,在运行时,当您创建 java 客户端/套接字时,工厂将执行著名的“SSL 握手”并执行一些验证。默认情况下,Java 客户端/套接字将:
- 检查服务器的证书是否与“主机”相对应:每个证书都有一个“服务器名称”,并且该证书只能从该服务器下载。因此,如果您从“www.oracle.com”服务器获得“www.google.com”证书,则此验证将失败。
- 检查证书是否是受信任的:如果它没有由权威机构签名,或者无法检查权威链,或者它不包含在您的“受信任的证书存储库”中,则此验证将失败。
重要提示:解释主机名检查的第一个要点是错误的:这不会发生在 SSLSocket 上,而是发生在 HTTPS 客户端上。感谢@EJP 和@Gergely Szilagyi 指出这一点
注意:有一种方法可以解决这些验证问题,例如:
- 要绕过/关闭服务器检查,请阅读这篇文章(不推荐!)
- 要将证书添加到客户端受信任的存储库,请查看此帖子