0

问题 - 我想连接到启用 SSL 的服务器主机(具有来自威瑞信的签名证书)。该主机批准/拒绝付款交易。

假设 - 1. ClientAuth 不是必需的。2. 我不是在处理 HTTPS

我想编写一个与该主机连接并发送请求和接收响应的 java 客户端。如果我的理解不正确,请更正。

  1. Java 客户端需要使用包 - 'javax.net.ssl.*' 。这个包有 'SSLSocket' 类来与 SSL 主机建立连接。
  2. 对于 Java 客户端“密钥库”/客户端证书(由威瑞信签名)不是必需的。仅当启用 clientAuth (TRUE) 时才需要它。
  3. 我是否需要在我的客户端代码中提供先验证服务器证书然后传输数据的规定?这一步是强制性的吗?
  4. 我是否绕过了一些强制性步骤?

谢谢,拉吉赫巴尔

4

2 回答 2

1

要创建安全套接字(客户端),您可以使用:

//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 指出这一点

注意:有一种方法可以解决这些验证问题,例如:

  • 要绕过/关闭服务器检查,请阅读这篇文章(不推荐!)
  • 要将证书添加到客户端受信任的存储库,请查看此帖子
于 2012-06-28T19:35:43.733 回答
0
  1. 正确的。
  2. 正确的。
  3. 不,它会自动发生。您可以添加一个检查证书的握手侦听器,或从 SSLSession 获取对等证书,但没有它也可以继续。
  4. 是的。
于 2012-06-28T21:45:27.873 回答