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

Java SSLSocket:如何发送完整的服务器证书链?,java,ssl,certificate,Java,Ssl,Certificate,在Java 7中创建SSLServerSocket时,服务器会正确使用我的服务器证书和密钥。证书由ca的子ca颁发。因此,从根证书到服务器证书的完整链有四个证书。 完整的链存在于密钥库/信任库中 但是,当客户端连接时,服务器始终只发送服务器证书本身。 这也适用于基于Java的web服务器,如Jetty 因为大多数客户端只安装了根ca证书,而没有安装两个子ca证书,所以这是一个大问题 如何强制Java在SSL/TLS握手中发送完整的证书链?密钥库中的密钥项不仅针对单个证书,而且针对证书链(请参阅,

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

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

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


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

密钥库中的密钥项不仅针对单个证书,而且针对证书链(请参阅,它采用
证书[]链
参数)

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


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

您是否在密钥库中使用整个链本身配置了此项(如中所述)?完整的链存在于密钥库中-我在问题中更新了该细节。只是为了澄清,我的意思不仅仅是在密钥库中有完整的密钥链,我的意思是在密钥库的正确条目中有完整的密钥链(也有私钥的条目)。对不起,我不理解你的问题。“钥匙链”是什么意思?只需要一个密钥——ssl证书的密钥。对不起,输入错误,我的意思是“链”。您需要在密钥库的同一个条目中导入完整的链,在不同的条目中拥有形成链的证书是不够的。(您是否遵循了所述程序?)