java - Java 中的 SSL 证书验证

标签 java ssl

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

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

当我在网上搜索这个时,我很惊讶地发现了这么少的东西。

最佳答案

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

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

SSLContext 将使用 TrustManager 初始化这决定了如何建立信任。

除非你需要特定的配置,你通常可以依赖the default values :这将依靠 PKIX 算法 (RFC 3280) 根据一组信任 anchor 验证证书(默认情况下在 cacerts 中)。 cacerts 随 Oracle JRE 一起提供,是一个 JKS keystore ,您可以向其中添加其他证书。例如,您可以使用 keytool 显式添加证书。

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

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

关于java - Java 中的 SSL 证书验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143360/

相关文章:

java - 如何阅读复杂的 map 和集合

java - Docker 外部数据库映射

java.lang.AbstractMethodError : com. mysql.jdbc.PreparedStatement.setBlob(ILjava/io/InputStream;)V

ssl - Apache 2 ssl 配置

wordpress - Authorize.net TLS 禁用通知、重力形式和 Let's Encrypt

java - 如何统计Stream已处理的元素数量?

facebook - 仅 SSL Facebook 页面选项卡

python - 验证证书的指纹

java - Java 是否支持 Let's Encrypt 证书?

java - UTF8编码问题