Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумРазбор ошибок

Сертификат не проверяется: что это значит и что делать

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
15 марта, 14:02первое сообщение

Принесли задачу, разбираю вторые сутки, вынесу сюда, тема живучая и всплывает у всех.

Есть три площадки из сорока в прогоне. На них с сервера прилетает вот такое:

curl: (60) SSL certificate problem: unable to get local issuer certificate

В браузере с той же машины сайт открывается, замок на месте, никаких предупреждений. Срок у сертификата не вышел, я смотрел. Имя в сертификате совпадает с адресом. Часы на сервере ходят верно, проверял по внешнему источнику.

Хочу разложить причины по полочкам, потому что за словами «сертификат не проверяется» прячется штук пять разных историй, и лечатся они по-разному.

читаю байты, а потом уже документацию
Настя Лужина
Настя Лужина
Новичок
сообщений 265
с янв, второй сезон
22 августа, 17:19#2

а браузер тогда почему молчит, у него же те же корни

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
1 января, 08:36#3

Корни те же, повадки разные. Браузер умеет добирать недостающие звенья сам, консольные утилиты обычно нет. Вот с этого и предлагаю начать разбор, похоже, что мы упёрлись ровно в него.

читаю байты, а потом уже документацию
hardline
hardline
Знаток
сообщений 970
с июн
8 июня, 11:53#4

Тогда смотрите цепочку целиком, там всё написано открытым текстом.

Механика проверки такая. Сайт при рукопожатии присылает свой сертификат и, по-хорошему, все промежуточные над ним, до того звена, корень которого лежит у вас в хранилище. Цепочка должна сомкнуться. Когда сайт присылает только свой сертификат и забывает промежуточный, у вас на руках остаётся кусок без опоры, и вы видите ровно ту фразу про local issuer.

Браузер в этот момент лезет по адресу, записанному внутри сертификата, скачивает недостающее звено сам и молча смыкает цепочку. Пользователь ничего не замечает. Утилита такого хода не делает и честно останавливается.

смотрим, сколько звеньев прислал сайт
смотрим, сколько звеньев прислал сайт

Одно звено в списке при том, что издатель указан чужой, и есть ваш ответ. У здорового сайта в этом месте два или три звена подряд.

linuxvsem
linuxvsem
Участник
сообщений 830
с июл
15 ноября, 14:10#5

Вторая по частоте история совсем другая, но выглядит один в один: хранилище корней на сервере старое или его нет вовсе. Особенно на голых образах и в контейнерах, там пакет с корнями часто выкидывают ради веса.

Проверяется в лоб:

ls -l /etc/ssl/certs/ca-certificates.crt
openssl version -d
apt-get install --reinstall ca-certificates && update-ca-certificates

Примета, по которой отличают от первой истории: при пустом хранилище отваливаются все сайты подряд. У вас отвалились три из сорока, значит хранилище на месте.

Настя Лужина
Настя Лужина
Новичок
сообщений 265
с янв, второй сезон
22 апреля, 17:27#6
hardline: браузер лезет по адресу, записанному внутри сертификата

вот теперь понятно, спасибо

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
1 сентября, 08:44#7

Подтверждаю версию hardline, у всех трёх площадок в ответе по одному звену. Издатель у них общий, промежуточный один и тот же. Занятно, что площадки друг с другом никак не связаны, просто одинаково собранный узел раздачи.

читаю байты, а потом уже документацию
Слава Кудрин
Слава Кудрин
Участник
сообщений 760
с авг
8 февраля, 11:01#8

Раз уж пошёл разбор по полочкам, добавлю третью историю, она реже, но ловит больно.

Часы. Сертификат действителен внутри окна дат, и проверка сверяет его с системным временем. Уехавшие на сутки вперёд часы на свежем сервере дают ту же самую картину «проверка не прошла», при этом сертификат живой и цепочка полная. У меня так было на машине, которая поднялась без службы времени.

timedatectl status
chronyc tracking

Отличается от остальных двух мгновенно: при уехавших часах падают вообще все площадки и текст ошибки говорит про срок, certificate is not yet valid.

byteflow
byteflow
Новичок
сообщений 225
с фев, второй сезон
15 июля, 14:18#9

Четвёртую добавлю: посредник со своим сертификатом посередине. Тогда в цепочке вы увидите незнакомое имя издателя на самом верху, и оно будет одинаковым для всех площадок.

Артём Пчёлкин
Артём Пчёлкин
Ветеран
сообщений 2310
с янв
22 декабря, 17:35#10

Раз перечисляем, скажу про самый частый ход в этой ситуации и почему он плохой.

Ход такой: увидели ошибку проверки, поставили ключ отключения и поехали дальше. Прогон снова зелёный, задача закрыта, все довольны. Через месяц выясняется, что половина выгрузки идёт с подменённого узла, и понять это невозможно: проверять-то нечем, вы сами убрали единственный признак, по которому отличают собеседника.

Правильный ход занимает те же пять минут. Промежуточное звено скачивается один раз и кладётся рядом с прогоном, дальше вы указываете его файлом:

curl --cacert /opt/progon/chain.pem https://target.example/

В библиотеках то же самое делается одним параметром пути к пачке корней. Проверка остаётся на месте, площадка ходит, ключа отключения в скрипте нет.

Оксана В.
Оксана В.
Участник
сообщений 350
с дек
1 мая, 08:52#11

Плюсую про ключ отключения. У нас в команде он вообще под запретом, вместо него в шаблоне прогона лежит пустой файл под свою пачку корней и строчка в описании, что туда класть.

linuxvsem
linuxvsem
Участник
сообщений 830
с июл
8 октября, 11:09#12

И проверяйте пачку раз в квартал, корни тоже стареют.

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
15 марта, 14:26#13

Подобью итог, раз тема получилась развесистой.

По моим трём площадкам подтвердилась первая история: узел раздачи отдаёт один сертификат без промежуточного звена. Скачал промежуточный по адресу из поля издателя, сложил его вместе с системной пачкой в отдельный файл, прописал этот файл прогону. Все сорок площадок идут, ключ отключения нигде не появился.

Свёл в кучу приметы, чтобы искать по теме было проще:

Что видитеКуда смотретьКто виноват
падают три площадки из сорокацепочка через s_clientсайт не досылает звено
падают все площадки сразухранилище корней на машинепакет корней вырезан или устарел
текст про срок, ещё не действителенсистемные часыслужба времени не поднялась
один незнакомый издатель у всехверх цепочкипосредник со своим сертификатом

Порядок действий на будущее простой: сначала посчитать, сколько площадок отвалилось, эта цифра сама уводит в нужную колонку. Потом посмотреть цепочку глазами. Отключать проверку не надо ни на одном из шагов.

читаю байты, а потом уже документацию