Java SSLSocket:如何发送完整的服务器证书链?

Rob*_*ert 2 java ssl certificate

当我在 Java 7 中创建 SSLServerSocket 时,服务器正确使用我的服务器证书和密钥。该证书是由 ca 的子 ca 颁发的。因此,从根证书到服务器证书的完整链有四个证书。完整的链存在于密钥库/信任库中。

但是,当客户端连接时,服务器始终仅发送服务器证书本身。这也适用于基于 Java 的 Web 服务器,例如 Jetty。

因为大多数客户端只安装了根 ca 证书,而不安装两个子 ca 证书,这是一个大问题。

如何强制 Java 在 SSL/TLS 握手中发送完整的证书链?

Bru*_*uno 5

密钥库中的密钥条目不仅适用于单个证书,还适用于证书链(请参阅KeyStore.setKeyEntry,它带有一个Certificate[] chain参数)。

如果您想使用特定的链,则需要将其设置为您拥有证书及其私钥的条目中的链。中间证书是否也在同一个密钥库中、不同的条目中并不重要。

这与让客户端发送完整的客户端证书链非常相似。从服务器的角度来看,相同的密钥库配置步骤也应该有效,如本问题中所述。