Java не отправляет сертификат клиента

Я использую 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, чтобы исправить это.


person kbolino    schedule 24.12.2013    source источник
comment
Обратите внимание, что клиент отправляет пустую цепочку сертификатов. Это означает, что ему не удалось найти сертификат, соответствующий ограничениям, указанным в CertificateRequest. Есть ли у клиента сертификат RSA или DSS?   -  person user207421    schedule 25.12.2013
comment
Все рассматриваемые сертификаты являются RSA   -  person kbolino    schedule 27.12.2013
comment
Можете ли вы подтвердить, что сервер на основе SSL настроен либо на получение, либо на требование сертификата клиента? (Я думаю, что журнал CertificateRequest указывает на это)   -  person Dave G    schedule 08.01.2014
comment
Сервер определенно настроен на требование сертификатов (RSA), а клиенты, отличные от Java, могут подключаться только тогда, когда они отправляют (действительные, доверенные) сертификаты.   -  person kbolino    schedule 11.02.2014
comment
@DaveG Тот факт, что сервер отправил CertificateRequest, уже подтверждает это.   -  person user207421    schedule 30.06.2016
comment
в этом вопросе отсутствует конфигурация клиента, что делает невозможным отладку вопроса. клиент должен правильно иметь контекст ssl.   -  person eis    schedule 06.08.2017