【问题标题】:SSL Certificate Verification in JavaJava中的SSL证书验证
【发布时间】:2012-06-23 23:52:24
【问题描述】:

假设我编写了两个 Java 应用程序:Ping.jarPong.jar,它们被部署并运行在两个单独的服务器上(Ping.jar 部署到 srv-01.myorg.comPong.jar 部署到 srv-02.myorg.com),并且这两个应用程序需要通过 SSL 相互通信(2 路)。我们还假设每个应用都有自己的 SSL 证书。

  • 作为一名 Java 程序员,我如何编写代码 PingPong 来验证彼此的 SSL 证书?每个 CA 是否提供某种我可以使用的 RESTful API,例如 HttpClient? Java 是否有自己的证书验证 API?是否有我可以使用的开源第三方 JAR 或服务?

我很惊讶当我在网上搜索这个时出现的很少。

【问题讨论】:

  • 您使用什么网络服务器?启用 SSL(在您的情况下为相互 SSL)通常是服务器配置的情况,而不是编码。
  • 好吧,让我们说两个场景:(1) 使用原始套接字/NIO 的纯 Java 应用程序(正如我上面的用例所暗示的那样),以及 (2) Oracle GlassFish。我现在实际上对这两个用例都感兴趣。
  • 广告 1. 从未尝试过,从头开始这可能是一项艰巨的任务。广告2.查看this link,特别是关于SSL和客户端证书认证的两个问题。还有更多内容,请阅读有关安全性的 Glassfish 文档,但就像我说的,这完全是关于配置,而不是编码。

标签: java ssl


【解决方案1】:

如果您使用 Java SE SSL/TLS 类(例如 SSLSocketSSLEngine)进行连接,则您使用的是 Java Secure Socket Extension (JSSE)

它将根据用于创建此SSLSocketSSLEngineSSLContext 验证远程方的证书。

这个SSLContext 将使用TrustManager 进行初始化,指示应该如何建立信任。

除非您需要特定配置,否则您通常可以依赖 the default values:这将依赖 PKIX 算法 (RFC 3280) 来根据一组信任锚验证证书(默认情况下在 cacerts 中)。 Oracle JRE 附带的cacerts 是一个JKS 密钥库,您可以向其中添加其他证书。例如,您可以使用 keytool 显式添加证书。

您还可以基于自定义密钥库以编程方式创建X509TrustManager(如this answer 中所述),并在不影响默认密钥的特定SSLContext 中使用它。

除此之外,如果您使用自己的协议,则需要验证您获得的证书是否与您要查找的主机名匹配(请参阅 RFC 6125)。通常,您可以在获得的X509Certificate 中查找主题备用名称(从SSLSession 获取链中的第一个对等证书),如果失败,请在主题可分辨名称中查找CN RDN。

【讨论】:

  • 此过程不包括检查证书是否被吊销。签名验证是不够的,因为已撤销的证书仍有有效的 CA 签名。
【解决方案2】:

您可以通过将HandshakeCompletedListener 附加到SSLSocket 并从事件中获取证书来获取对等证书,或者通过从SSLSocket 获取SSLSession 并从会话中获取对等证书.

SSL 提供对等身份的隐私、完整性和身份验证。该对等身份是否是应用程序所期望的身份,以及该身份在应用程序中被允许做什么,如有必要,应由应用程序检查。这是“授权”步骤,SSL 无法为您完成。

【讨论】:

    【解决方案3】:

    AFAIK 证书验证应包括以下步骤:

    1. 通过验证其签名、当前时间的有效性和使用给定证书的域的有效性来证明形式验证。无需任何额外的网络通信即可检查这些内容。
    2. 检查证书是否未被吊销 - 这是@Bruno 给出的答案中缺少的内容(否则我同意他的观点)。我认为只有在从签署证书(与 CA 的网络通信)的 CA 获得新的 CRL(证书吊销列表)后才能进行此检查。

    【讨论】:

      【解决方案4】:

      您不必手动检查彼此的证书。

      您只需将每个服务器证书导入到彼此的 cacerts 中,这样两个应用程序服务器就会自动相互信任。

      【讨论】:

      • 如果两个端点都在撒谎怎么办?我提供了这个 Ping/Pong 示例来说明尝试在纯 Java 中验证证书的概念。我写 Ping/Pong 的事实并不意味着他们可以互相信任!更抽象地思考:如果 Ping 和 Pong 由不同的开发商店编写并托管在 2 个完全独立的网络上,那么他们需要做什么来验证彼此的证书?
      • 是的。 SSL 提供对等身份的隐私、完整性和身份验证。该对等身份是否是应用程序所期望的身份,以及该身份在应用程序中被允许做什么,如有必要,应由应用程序检查。这是“授权”步骤,SSL 无法为您完成。
      • 这个答案很脆弱(如果在生产环境中完成,则很危险)。当任一端点的证书更新时,事情就会中断。
      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 2017-06-13
      • 2019-03-29
      • 2016-12-06
      • 2015-12-15
      • 2014-09-24
      • 1970-01-01
      • 2012-03-24
      相关资源
      最近更新 更多