Я пытаюсь подключиться к безопасному веб-сервису.
Я получал отказ от рукопожатия, несмотря на то, что хранилище ключей и доверительное хранилище были установлены правильно.
После нескольких дней разочарования, бесконечного поиска в Google и выяснения всех вокруг я узнал, что единственная проблема заключалась в том, что Java решил не отправлять сертификат клиента на сервер во время рукопожатия.
В частности:
- Сервер запросил сертификат клиента (CN = RootCA) - то есть "дайте мне сертификат, подписанный корневым ЦС"
- Java заглянула в хранилище ключей и только нашла мой клиентский сертификат, подписанный "SubCA", который, в свою очередь, выдается "RootCA". Он не потрудился заглянуть в доверительную сеть... duh OK Я думаю,
- К сожалению, когда я попытался добавить сертификат "SubCA" в хранилище ключей, это совсем не помогло. Я проверил, загружены ли сертификаты в хранилище ключей. Они делают, но KeyManager игнорирует все сертификаты, кроме клиентского.
- Все вышеизложенное приводит к тому, что java решает, что у него нет сертификатов, удовлетворяющих запросу сервера, и ничего не посылает... tadaaa handshake failure: - (
Мои вопросы:
- Возможно ли, что я добавил сертификат "SubCA" в хранилище ключей так, чтобы "сломал цепочку сертификатов" или что-то такое, что KeyManager загружает только сертификат клиента и игнорирует остальные? (Chrome и openssl справятся с этим так, почему они не могут быть java? - обратите внимание, что сертификат SubCA всегда представляется отдельно как доверенный орган, поэтому Chrome, по-видимому, правильно упаковывает его вместе с сертификатом клиента во время рукопожатия)
- Является ли это официальной "проблемой конфигурации" на стороне сервера? Сервер является третьим лицом. Я ожидаю, что сервер запросит сертификат, подписанный органом "SubCA", с тех пор, как они нам предоставили. Я подозреваю, что тот факт, что это работает в Chrome и openssl, заключается в том, что они "менее ограничительные", а java просто "по книге" и не работает.
Мне удалось собрать грязный обходной путь для этого, но я не очень доволен этим, поэтому буду рад, если кто-нибудь сможет прояснить это для меня.