Я пытаюсь подключиться к безопасному веб-сервису.Почему Java не отправляет сертификат клиента во время подтверждения SSL?
Я получал отказ от рукопожатия, хотя хранилище ключей и доверительное хранилище были установлены правильно.
После нескольких дней разочарования, бесконечного поиска в Google и выяснения всех вокруг я узнал, что единственная проблема заключалась в том, что Java решил не отправлять сертификат клиента на сервер во время рукопожатия.
В частности:
- Сервер запросил сертификат клиента (CN = ROOTCA) - т.е. «дать мне сертификат, подписанный корневой ЦС»
- Java посмотрел в хранилище ключей и только нашел свой клиент сертификат, подписанный «SubCA», который, в свою очередь, выдается «RootCA». Он не потрудился заглянуть в траст-магазин ... duh OK Я думаю,
- К сожалению, когда я попытался добавить сертификат «SubCA» в хранилище ключей, это совсем не помогло. Я проверил, загружены ли сертификаты в хранилище ключей. Они делают, но KeyManager игнорирует все сертификаты, кроме клиентского.
- Все выше, приводит к тому, что Java решает его не имеет каких-либо сертификатов, которые удовлетворяют запрос сервера и отправляет ничего ... tadaaa отказ квитирования :-(
Мои вопросы:
- Возможно ли, что я добавил сертификат «SubCA» в хранилище ключей таким образом, чтобы «сломал цепочку сертификатов» или что-то еще, чтобы KeyManager загружал только клиентский сертификат и игнорировал остальные? (Chrome и openssl справляются с цифрой что почему я не могу java? - обратите внимание, что сертификат «SubCA» всегда представляется отдельно как доверенный орган, поэтому Chrome appare ntly правильно упаковывает его вместе с сертификатом клиента во время рукопожатия)
- Является ли это официальной «проблемой конфигурации» на стороне сервера? Сервер является третьим лицом. Я ожидаю, что сервер запросит сертификат, подписанный органом «SubCA», поскольку это то, что они нам предоставили. Я подозреваю, что тот факт, что это работает в Chrome и openssl, заключается в том, что они «менее ограничительные», а java просто «по книге» и не удается.
Мне удалось собрать грязное обходное решение для этого, но я не очень этому доволен, поэтому буду рад, если кто-нибудь сможет прояснить это для меня.
Следует добавить к ответу @ Bruno, что основная причина заключается в том, что был закрытый ключ, но не соответствующий сертификат (т. Е. С тем же псевдонимом), поэтому Java не мог отправить его, когда его спрашивали сообщения «CertificateRequest». Другие причины этого могут не включать сертификат, подписанный эмитентами, указанным сервером, или сертификаты, соответствующие шифрам, указанным сервером. – EJP
Мы решили эту проблему, просто сопоставив шифры, указанные сервером. Спасибо вам, ребята, за всю эту информацию, это было очень полезно. –