Рейтинг:1

Почему (не браузерные) клиенты иногда не доверяют действительным подписанным сертификатам?

флаг us

Это несколько канонический вопрос... Надеюсь, ничего страшного.

По своей работе я часто устраняю неполадки в ситуациях, когда клиент, работающий на сервере Linux (обычно приложение Java), не доверяет действительному подписанному сертификату — сертификату, которому доверяют браузеры. Наше обычное быстрое решение — добавить сертификат в хранилище доверенных сертификатов java cacerts, но меня раздражает, зачем это нужно.

В моем понимании есть два варианта:

  1. Сторона сервера не отправляет полную цепочку (сертификат конечного объекта + промежуточные сертификаты) в правильном порядке, И клиент не доверяет промежуточным сертификатам (возможно, потому, что они слишком старые).
  2. Хранилище доверия клиента не содержит корневого сертификата для использования в качестве якоря доверия (возможно, потому, что оно слишком старое).

Это точно? Если это так, то альтернативными возможностями принудительного доверия к сертификату конечного объекта являются:

  • Настройте серверное приложение для отправки всей цепочки.
  • Обновите клиент (например, java) до более новой версии. В моем случае, как правило, основная версия Java, которую можно использовать, ограничена предварительными программными требованиями, но, возможно, каждая дополнительная версия содержит обновленное хранилище доверия?

Приветствуются любые мысли о разъяснениях.

Steffen Ullrich avatar
флаг se
* «И клиент не доверяет промежуточным сертификатам (возможно, потому, что они слишком старые)» * - это не связано со старыми. Хранилище доверия просто содержит только корневой ЦС, и ожидается, что сервер отправит промежуточные сертификаты. Промежуточное звено считается доверенным, если оно было выпущено локальным доверенным корневым ЦС или другим доверенным промежуточным звеном, независимо от возраста клиента.
Steffen Ullrich avatar
флаг se
Кроме того, вы затрагиваете основные моменты. Другие возможные причины: клиент не может отправить SNI (хотя большинство современных клиентов это делают), сервер правильно настроен для IPv4, но не для IPv6, и клиент пытается подключиться к IPv6, в то время как браузер может использовать IPv4.
DarkMoon avatar
флаг in
Вы не упомянули операционную систему, но я считаю, что в Windows браузеры используют хранилище сертификатов Windows, но Java по умолчанию использует собственное хранилище. Так что только потому, что браузер доверяет ему, не означает, что Java будет. javax.net.ssl.trustStoreType можно использовать, чтобы указать ему получить список доверенных корневых сертификатов из внутреннего сертификата Windows.
dave_thompson_085 avatar
флаг jp
@DarkMoon: IE Edge и Chrome/Windows используют хранилище сертификатов Windows, но Firefox использует свое собственное. Во всех ОС сборки Java из Oracle (и ранее Sun) по умолчанию используют собственный файл cacerts, но OpenJDK зависит от сборщика; OpenJDK, созданный для дистрибутивов Linux (всегда? почти всегда?), использует системное хранилище.
em_bo avatar
флаг us
@SteffenUllrich Насколько я могу судить, Java часто поставляется с промежуточными сертификатами для основных центров сертификации. Я видел, как возраст клиента вступает в игру, когда ЦС переключается на более новый промежуточный сертификат, чем тот, который поставляется.
em_bo avatar
флаг us
@DarkMoon Я не был явным, но контекст моего вопроса - это прежде всего серверы Linux, поэтому рассматриваемый браузер и рассматриваемый клиент не работают в одной и той же системе.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.