我在Java 1.7上使用HttpClient 4.2.3连接到由nginx托管的远程服务器 . 我的组织广泛使用PKI,远程和客户端都拥有由公共CA颁发的证书 .

服务器有一个如下所示的签名链:

CN=Server 123, OU=Servers, OU=My Division, O=My Org, C=US
CN=My Division CA, OU=My Division, O=My Org, C=US
CN=My Org CA, O=My Org, C=US

客户端有一个如下所示的签名链:

CN=Client 456, OU=Servers, OU=My Division, O=My Org, C=US
CN=My Division CA, OU=My Division, O=My Org, C=US
CN=My Org CA, O=My Org, C=US

出于某种原因,客户端不会将其证书提供给服务器 . 服务器配置正确(例如,使用--cert, - key和--cacert卷曲) . 客户端在密钥库中具有其证书,私钥和签名链,在其信任存储中具有“我的分部CA”和“我的组织CA”证书(以及其他) . 启用SSL调试后,我可以看到密钥存储和信任存储加载成功 . 客户端可以连接到正确请求证书的其他服务器 . 但是,在尝试连接到“Server 123”时,我看到如下内容:

*** ServerHello, TLSv1
...
** TLS_RSA_WITH_AES_256_CBC_SHA
...
*** Certificate chain
...
***
Found trusted certificate:
...
*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
<CN=My Division CA, OU=My Division, O=My Org, C=US>
<CN=My Org CA, O=My Org, C=US>
<CN=Some Other CA, OU=Some Division, O=My Org, C=US>
...
*** ServerHelloDone
...
*** Certificate chain
***
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1
...
HTTP/1.1 400 Bad Request
...
No required SSL certificate was sent
...

最令人困惑的部分是具有相同软件的其他客户端提供其证书并且可以正常连接 .

我已经正确配置了所有基础设施(据我所知),这应该可行 . 我真的不想编写和维护自定义SSL代码来解决这个问题 .