java - 如何在 TrustStore 中处理别名

标签 java ssl keystore truststore

我正在运行在 JVM 参数中配置的 Java 进程(微服务)和 trustStore。如果微服务需要连接需要在 trustStore 中导入证书的外部 URL。

Example: 
example.co.uk -> examplecouk as alias in trustStore
example.com -> examplecom as alias in trustStore
example.in  -> examplein as alias in trustStore

由于我没有在 JVM 参数中传递/提及别名,Java 如何知道要从特定端点的 trustStore 中选择哪些证书和别名?是随机挑选的吗?

最佳答案

user207421 几乎是正确的。更准确地说:

当您作为客户端打开与服务器的 SSL/TLS 连接时,作为握手的一部分,服务器会发送包含其自己的证书的证书“链”,通常加上一个或多个以“根”结尾的链接 CA(证书颁发机构)证书应该信任的 CA。查看相邻堆栈 https://security.stackexchange.com/questions/20803/how-does-ssl-work/以获得极其完整的解释。公共(public)服务器通常使用由公共(public) CA 颁发和签名的证书,例如 Digicert、GoDaddy、LetsEncrypt/ISRG,它们已经在标准默认信任库中(对于文件 JRE/lib/security/cacerts 中的 Java),因此无需执行任何操作。如果服务器使用来自非品牌或私有(private) CA 的证书,或自签名证书(根本没有 CA),那么(对于 Java)必须将链中的某些证书​​添加到客户端信任库,或者以其他方式覆盖;这仅在服务器证书是自签名的情况下才需要是服务器证书(它本身是一个链并且没有相关的 CA 证书)。

Java/JSSE 通过 SSLContext 实现这一点。其中包含一个 TrustManager ,更具体地说是 X509ExtendedTrustManager ,它是从信任库初始化的。您可以创建 SSLContext在来自任何可信证书集的代码中显式地显示(甚至不需要来自文件),或者使用使用默认信任库文件的默认上下文,除非被系统属性覆盖,否则默认为上面的文件名。

当接收到服务器证书链时,它被传递给上下文的 TrustManager 进行验证;在(许多!)其他检查中,在普通链的每个级别或自签名证书的单个级别,JSSE TrustManager 查找具有相同主题和(主题)公共(public) key 的 anchor 证书,如果是,则使用它来验证证书链。请注意,如果改用主题备用名称,则普通(CA 颁发)叶证书可以使主题为空——请参阅 rfc5280 和 rfc2818——但自签名证书不能,因为它的主题 = 颁发者且颁发者不得为空.不同实体(例如不同服务器)的证书通常具有不同的 key ,尽管单个实体可以拥有多个具有相同 key 或不同 key 的证书,并且可能对应于多个服务器名称和/或地址。

如果证书通常被确定为有效,对于某些 TLS 应用程序,特别是 HTTPS, validator 还会检查它是否适用于正确的服务器,特别是主题字段中的 CommonName 属性,或者主题备用名称扩展中的条目(如果存在) - - 对于至少十年的公共(public) CA,它与 URL 中的主机 DNS 名称或 IP 地址相匹配。在较早版本的 Java(通过 6 IIRC)中,这不是在 JSSE 中完成,而是在调用应用程序或库中完成,例如 HttpsURLConnection ,作为遗留系统,它仍然可以选择使用自己的 HostnameVerifier反而。

所有这些都可以通过使用自定义 TrustManager 来更改。代替标准的,以及一些像 Apache HttpClient 这样的东西这样做是有效的,但您会在此处找到(太多)答案以及其他一些建议您使用绝育 TrustManager 来“解决”TLS 错误的堆栈。它只接受任何证书,无论它是否实际上是有效和正确的,因此很乐意将敏感数据连接并发送给任何设法拦截 IP 流量的攻击者,或者接受来自任何攻击者的更改,这在如今通常很容易。

关于java - 如何在 TrustStore 中处理别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58232636/

相关文章:

java - Hibernate Java 持久化列问题

java - JDBC 不会更新 PostgreSQL 数据库

apache - 使用 https 将域重定向到另一个域时出错

ssl - Jboss 使用自签名证书而不是导入的受信任证书

java - Reactor 有没有办法忽略错误信号?

java - Oracle EBS 种子 APi 调用 java.sql.SQLException : Non supported SQL92 token at position: 6

php - 如何通过 ftp_ssl_connect 使用客户端证书

apache - 如何让我的 nextjs with Express 站点在 ssl 上工作

java - 使用其他 PC 时出现 SSL 验证程序异常

android - 编码为 base64 keystore 文件