Я использую HttpClient 4.2.3 на Java 1.7 для подключения к удаленному серверу, размещенному на nginx. Моя организация широко использует PKI, и как удаленный сервер, так и клиент имеют сертификаты, выданные общим центром сертификации.
Сервер имеет цепочку подписи, подобную следующей:
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
По какой-то причине клиент не предоставляет серверу свой сертификат. Сервер настроен правильно (например, curl с --cert, --key и --cacert работает). У клиента есть свой сертификат, закрытый ключ и цепочка подписи в хранилище ключей, а также сертификаты «ЦС моего подразделения» и «ЦС моей организации» (среди прочего) в его хранилище доверенных сертификатов. При включенной отладке SSL я вижу успешную загрузку хранилища ключей и хранилища доверия. Клиент может подключаться к другим серверам, которые правильно запрашивают сертификаты. Однако при попытке подключиться к «Серверу 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, чтобы исправить это.