我目前正在使用Java的SSL客户端,需要与需要客户端身份验证的第三方服务器 Build https连接 . 服务器人员给了我一个受信任的根CA证书,用于签署客户端和服务器证书 . 我把这个证书放在我这边的信任库里 . 服务器人员还具有此根CA证书,用于验证客户端证书 .
当我尝试 Build SSL连接服务器时,我看到当服务器发送它的证书时,握手会很好,我的客户端能够成功验证它 . 但作为“证书请求”消息的一部分,服务器不会在“证书颁发机构”参数中返回任何根CA证书 . 由于这个原因,我的客户端不会将客户端证书发送回服务器,并且握手失败 .
我正在使用WSDL存根编写标准Java代码 . 我正在利用wsdl2Java ant任务生成的wsdl存根 .
所以我的问题是:即使服务器在请求客户端身份验证时发送一个空的“证书颁发机构”列表,我是否可以让我的Java客户端将预先设置的客户端证书发送回服务器 . (我阅读了TLS RFC,我发现服务器发送这样的空列表是合法的,在这种情况下,客户端可以发回它认为合适的任何证书 . 我试图实现完全相同的行为) .
2 回答
有's no point in this. The server still won' t接受它 . 至少它不应该接受它,如果它正在使用常见的任何SSL实现,它很可能赢得了他们调整自己的SSL实现的可能性 .
问题出在服务器端 . 它配置错误 . 您无法在客户端修复它 . 它应该在
CertificateRequest
消息中向您发送根CA证书或其签名者之一 .很抱歉回复这个古老的帖子,但我无法抗拒 .
我看到这种握手工作得很好:
根据javax.net.debug = all
但它可能取决于您的HTTP客户端库以及它如何处理SSL / TLS(重新)协商 . 这是使用Java 8和http://spray.io/documentation/1.2.4/spray-client/