Хостинг от Discourse использует истёкшие SSL-сертификаты, но статус-страница зелёная

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

❯ openssl s_client -connect (removed).com:443 -servername (removed).com
CONNECTED(00000005)
depth=1 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0
depth=1 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0
depth=3 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0
---
Certificate chain
 0 s:/CN=(removed).com
   i:/C=US/O=Let's Encrypt/CN=R3
 1 s:/C=US/O=Let's Encrypt/CN=R3
   i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
 2 s:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---

API-эндпоинты возвращают для нас ошибку истекшего сертификата, что подтверждено через Postman.

@команда, пожалуйста, помогите здесь

Хм. Это кажется странным

Это действительно похоже на проблему на вашей стороне (то есть на стороне вашего сайта).

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

Я не знаю точной конфигурации вашего сайта, поэтому взял произвольный сайт hosted-by-discourse.com и проверил его с помощью Qualys SSL Server Test.

Как видно, корневой сертификат второго пути сертификации действительно истёк, но это компенсируется тем, что сертификат ISRG Root X1 присутствует в хранилище доверенных сертификатов (то есть включён в ваш браузер и/или операционную систему) для первого пути сертификации.

Серверы обычно не часто обновляют своё хранилище доверенных сертификатов, поэтому, вероятно, на вашем сервере отсутствует сертификат ISRG Root X1. (То же самое произошло и с образом Docker для почтового получателя).

Актуальный набор сертификатов можно найти, например, по адресу https://curl.se/ca/cacert.pem. В CentOS этот файл следует поместить в /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem. В Ubuntu можно использовать команду update-ca-certificates, которая обновит файл /etc/ssl/certs/ca-certificates.crt.

Альтернативно, вы можете временно отключить проверку SSL-сертификатов в коде вашего сервера.

Я опубликовал вывод openssl, чтобы доказать, что это не имеет никакого отношения к нашему сайту, а также потому, что Postman запускается с локальной машины под Windows.

edit: я не так хорошо разбираюсь в различных уровнях хранилищ доверия, я изучу это подробнее, проблема возникает на каждой машине, которую мы пробуем.

Правильно, при использовании реального браузера проблема не возникает?

РЕДАКТИРОВАНИЕ: всё больше людей сталкиваются с проблемами в Postman, так что, похоже, это не валидный тест… :thinking:

Вот ответ, который я получил от нашего специалиста по DevOps.


Проблема в том, что существует две копии корневого сертификата ISRG Root X1: одна была выпущена давно через DST Root CA X3, а более новая — самозаверяемая, выпущенная самой ISRG (организацией, управляющей, среди прочего, Let’s Encrypt). Этот самозаверяемый корневой сертификат теперь принят как доверенный на большинстве систем.

Оба сертификата являются одинаковыми по содержанию подписи, поэтому вы можете проверить любой сертификат, заявляющий, что он выпущен «ISRG Root X1», используя любую из версий. Однако версия, подписанная DST, больше не действительна как часть цепочки сертификации, поскольку сертификат DST, которым она была подписана, теперь истёк.

Если бы сервер корректно предоставлял новую самозаверяемую версию ISRG Root X1, то клиент сравнил бы предоставленный сертификат со своим хранилищем доверия, убедился бы, что это тот же самый сертификат, и всё было бы в порядке. Но вместо этого он видит предоставленный сертификат, думает: «Хорошо, мне нужно проверить его по DST Root CA X3, который у меня есть… ой, он истёк» — и проверка завершается неудачей.

Предоставление сертификата в цепочке сертификатов, который должен находиться в хранилище доверенных корневых центров сертификации, совсем не означает «делать всё правильно».

Давайте посмотрим на цепочку сертификатов самого letsencrypt.org: SSL Server Test: letsencrypt.org (Powered by Qualys SSL Labs)

О, смотрите. Они делают то же самое, цепочка сертификатов идентична (за исключением, конечно, серверного сертификата).

Так что либо ваш специалист по DevOps ошибается, либо CDCK, и LetsEncrypt, и Qualys ошибаются.
Попросите его обновить хранилище корневых центров сертификации. Это решит проблему. Поверьте мне.

Привет @bpaterson2000 — жаль слышать, что у вас возникли проблемы с подключением к нашему хостинговому сервису. Как уже отметил @RGJ, проблема не на стороне Discourse — её необходимо исправить на вашем клиенте. (Наши серверы не «поставляют» корневой сертификат; он управляется вашим клиентом.)

Дополнительную информацию об этом изменении можно найти на сайте Let’s Encrypt:

Спасибо за информацию. Для нас это неожиданная проблема, так как ошибки, судя по всему, возвращались с хостинг-сервера.

Мы используем Heroku, который, по всей видимости, включает в себя упомянутые вами компоненты через node/packages. Похоже, что обновление node стало ключом к успешному восстановлению подключения к REST API Discourse.

Спасибо за вашу помощь.