java - 启用 SSL 的主机

标签 java ssl client host

问题 - 我想连接到启用 SSL 的服务器主机(已从 verisign 签署证书)。该主机批准/拒绝付款交易。

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

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

  1. Java 客户端需要使用包 - 'javax.net.ssl.*'。这个包 具有“SSLSocket”类以与 SSL 主机建立连接。
  2. 对于 Java 客户端“keystore”/客户端证书(由 verisign 签名) 不需要。只有在启用 clientAuth 时才需要 (正确)。
  3. 我是否需要在我的客户端代码中有一个条款来首先验证 服务器证书然后传输数据?这是这一步 强制性的?
  4. 我是否绕过了一些强制性步骤?

谢谢, 拉吉赫巴尔

最佳答案

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

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

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

  • 要绕过/关闭服务器检查,请阅读此 post (不推荐!)
  • 要将证书添加到客户端受信任的存储库,请检查此 post

关于java - 启用 SSL 的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11251373/

相关文章:

java - 我如何暂停扫描仪阅读以广播消息?

Java - Random.nextInt 编译错误;_;

python - pymongo [SSL : CERTIFICATE_VERIFY_FAILED]: certificate has expired on Mongo Atlas

javascript - 使不安全的图像源成为安全的客户端

java - java swing中的setvisible方法挂起系统

java - Hibernate 中是否需要显式更新?

java - 如何使用带有证书的 Apache Commons SSLServer/SSLClient

perl - 使用 Event::Lib 制作 perl 聊天客户端

java - Android 手机上的套接字连接超时

sockets - 套接字客户端连接