我在 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 进行卷曲工作)。客户端在密钥存储中拥有其证书、私钥和签名链,在其信任存储中拥有“My Division CA”和“My Org 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
...
最令人困惑的部分是具有相同软件的其他客户端提供其证书并且可以正常连接。
我已经正确配置了所有基础设施(据我所知),并且这should工作。我really不想编写和维护自定义 SSL 代码来解决此问题。