问题 - 我想连接到启用 SSL 的服务器主机(已从 verisign 签署证书)。该主机批准/拒绝付款交易。
假设 - 1. ClientAuth 不是必需的。 2. 我不是在处理 HTTPS
我想编写一个 java 客户端,它将与该主机连接并发送请求和接收响应。如果我的理解不正确,请指正。
- Java 客户端需要使用包 - 'javax.net.ssl.*'。这个包 具有“SSLSocket”类以与 SSL 主机建立连接。
- 对于 Java 客户端“keystore”/客户端证书(由 verisign 签名) 不需要。只有在启用 clientAuth 时才需要 (正确)。
- 我是否需要在我的客户端代码中有一个条款来首先验证 服务器证书然后传输数据?这是这一步 强制性的?
- 我是否绕过了一些强制性步骤?
谢谢, 拉吉赫巴尔
最佳答案
要创建安全套接字(客户端),您可以使用:
//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 指出这一点
注意:有一种方法可以解决这些验证问题,例如:
关于java - 启用 SSL 的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11251373/