我目前正在使用Java的SSL客户端,需要与需要客户端身份验证的第三方服务器建立https连接。服务器人员给了我一个受信任的根CA证书,用于签署客户端和服务器证书。我把这个证书放在我这边的信任库里。服务器人员还具有此根CA证书,用于验证客户端证书。
当我尝试建立SSL连接服务器时,我发现当服务器发送它的证书时,握手会很好,我的客户端能够成功验证它。但作为“证书请求”消息的一部分,服务器不会在“证书颁发机构”参数中返回任何根CA证书。因此,我的客户端不会将客户端证书发送回服务器,并且握手失败。
我正在使用WSDL存根编写标准Java代码。我正在利用wsdl2Java ant任务生成的wsdl存根。
所以我的问题是:即使服务器在请求客户端身份验证时发送空的“证书颁发机构”列表,我是否可以让我的Java客户端将预先设置的客户端证书发送回服务器。 (我读了TLS RFC,我发现服务器发送这样的空列表是合法的,在这种情况下客户端可以发回它认为合适的任何证书。我试图实现完全相同的行为。)
答案 0 :(得分:1)
这没有意义。服务器仍然不接受它。至少它不应该接受它,如果它使用常见的任何SSL实现,它将不接受它。而且他们完全没有调整自己的SSL实现。
问题出在服务器端。它配置错误。您无法在客户端修复它。它应该在CertificateRequest
消息中向您发送根CA证书或其中一个签名者。
答案 1 :(得分:0)
很抱歉回复这个古老的帖子,但我无法抗拒。
我看到这种握手工作得很好:
根据javax.net.debug = all
*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withRSA, Unknown (hash:0x6, signature:0x2), SHA512withECDSA, SHA384withRSA, Unknown (hash:0x5, signature:0x2), SHA384withECDSA, SHA256withRSA, Unknown (hash:0x4, signature:0x2), SHA256withECDSA, SHA224withRSA, Unknown (hash:0x3, signature:0x2), SHA224withECDSA, SHA1withRSA, SHA1withDSA, SHA1withECDSA
Cert Authorities:
<Empty>
*** ServerHelloDone
matching alias: our_client_cert_alias
*** Certificate chain
chain [0] = [
[
Version: V3
Subject: CN=
但它可能取决于您的HTTP客户端库以及它如何处理SSL / TLS(重新)协商。这是使用Java 8和http://spray.io/documentation/1.2.4/spray-client/
答案 2 :(得分:0)
我们遇到了类似的问题,并且有点有趣,我们使用的库是spring-ws和spring-ws-support,您可以在其中创建HttpsUrlMessagenSender bean来进行肥皂调用,通过设置自定义KeyStoreFactoryBean可以设置jks密钥库(客户端证书)位置。但是我们在这里提到了同样的问题。
但是,如果我们使用默认行为(不使用HttpsUrlMessagenSender bean),并通过java.net.ssl.keyStore传递密钥库,则它的工作原理是,带有空的证书颁发机构列表,无论如何它都会发送客户端证书。
在我看来,jvm arg触发了一些不同的行为。某些软件甚至具有处理此http://techcommunity.softwareag.com/web/guest/pwiki/-/wiki/Main/Debugging+TLS+SSL+connections+in+Integration+Server
的标志