Рейтинг:2

Как исправить цепочку сертификатов с помощью letsencrypt/certbot?

флаг cn

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

Отказ от ответственности: я не админ и пока мало работал с сертификатами.

Подтвердить с помощью OpenSSL

$ openssl verify -CAfile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem /etc/letsencrypt/live/co2-avatar.com/cert.pem

# /etc/letsencrypt/live/co2-avatar.com/cert.pem: C = США, O = Исследовательская группа по безопасности в Интернете, CN = ISRG Root X1
# ошибка 2 при глубине поиска 2: невозможно получить сертификат эмитента

Проверить наличие одного из доменов в сертификате

openssl s_client -connect co2avatar.org:443 -имя_сервера co2avatar.org
# ПОДКЛЮЧЕН(00000003)
# depth=0 CN = gitlab.sustainable-data-platform.org
# ошибка подтверждения: num=20: невозможно получить сертификат локального эмитента
# проверить возврат:1
# depth=0 CN = gitlab.sustainable-data-platform.org
# ошибка подтверждения: num=21: невозможно проверить первый сертификат
# проверить возврат:1
# ---
# Цепочка сертификатов
# 0 s:CN = gitlab.sustainable-data-platform.org
# i:C = US, O = Let’s Encrypt, CN = R3
# ---
#Сертификат сервера
# -----НАЧАТЬ СЕРТИФИКАТ-----

Или беги

завиток -v https://co2avatar.org
# * Попытка 85.214.38.88:443...
# * TCP_NODELAY установлен
# * Подключен к co2avatar.org (85.214.38.88) порт 443 (#0)
# * ALPN, предложение h2
# * ALPN, предлагающий http/1.1
# * успешно установил места для проверки сертификатов:
# * CA-файл: /etc/ssl/certs/ca-certificates.crt
# CApath: /etc/ssl/certs
# * TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
# * TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
# * TLSv1.2 (IN), рукопожатие TLS, сертификат (11):
# * TLSv1.2 (OUT), оповещение TLS, неизвестный ЦС (560):
# * Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента
# * Закрытие соединения 0
# curl: (60) Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента

Это может быть как неправильная конфигурация моего виртуального хоста Apache для домена, так и проблема в самой цепочке сертификатов. Как я могу проверить последний (я много гуглил, но большинство хитов около проверка openssl с -CA-файл или о другом эмитенте сертификата)?

Нужно ли мне проверять пакет корневых сертификатов а как именно?

Есть ли что-то вроде -доверие флаг за certbot?

Рейтинг:6
флаг in

Попробуйте openssl s_client и позвольте вам показать сертификаты. Команда:

$ openssl s_client -connect co2avatar.org:443 -имя_сервера co2avatar.org -showcerts

Вы обнаружите, что ваш сервер возвращает сертификат для CN = gitlab.sustainable-data-platform.org и альтернативное имя субъекта, которое включает ваш домен DNS: co2-avatar.com. Так что с сертификатом все в порядке.

Если вы хотите объединить все в один конвейер команд, чтобы увидеть содержимое вашего сертификата:

эхо | openssl s_client -connect co2avatar.org:443 -servername co2avatar.org -showcerts 2>/dev/null |sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | openssl x509 -noout -текст

Чего не хватает, так это промежуточного сертификата. Это также должно быть отправлено сервером, но первая команда показывает, что его там нет - ваш сервер отправляет только сертификат.

Таким образом, ошибка openssl верна, так как действительно отсутствует промежуточный сертификат.

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

Имя файла должно быть похоже на /etc/apache2/sites-enabled/co2-avatar.com-le-ssl.conf

<IfModule mod_ssl.c>
SSLStaplingCache shmcb:/var/run/apache2/stapling_cache(128000)
<VirtualHost *:443>
        ServerName co2-avatar.com
        ServerAlias www.co2-avatar.com
#... 
#... insert your other stuff here...
#...

SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/co2-avatar.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLUseStapling on
</VirtualHost>
</IfModule>

Основываясь на вашем описании, я думаю, что следующая строка неверна в вашей конфигурации: SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/cert.pem. Его следует заменить на SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem, чтобы отправить также промежуточные звенья.

ОБНОВЛЕНИЕ решения (после обсуждения)

В ходе обсуждения выяснилось, что версия openssl и Apache, используемая на этом сервере CentOS, просто устарела, поэтому некоторые функции не поддерживаются. (Apache 2.4.6, OpenSSL 1.0.2k, промежуточная конфигурация, без HSTS, без OCSP)

Согласно с Генератор SSL-конфигураций Mozilla в этом случае можно использовать следующую общую конфигурацию:

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate
    SSLCertificateChainFile /path/to/intermediate_certificate
    SSLCertificateKeyFile   /path/to/private_key
</VirtualHost>

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

<VirtualHost *:443>
    ServerName  sustainable-data-platform.org
    ServerAlias co2-avatar.com
    ServerAlias ... <include all other SAN names here>
    
    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/live/co2-avatar.com/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/co2-avatar.com/privkey.pem

</VirtualHost>

В качестве примечания для таких старых установок

Срок действия промежуточных и корневых сертификатов Cross-Signed Let’s Encrypt R3 и DST Root CA X3 истекает 29 сентября 2021 г. и 30 сентября 2021 г. соответственно. Таким образом, с 4 мая 2021 г. вновь выпущенные сертификаты используют более длинную цепочку с перекрестно подписанным ISRG Root X1 в качестве промежуточного сертификата.

К сожалению, из-за способа построения и проверки путей сертификатов не все реализации TLS могут успешно проверять перекрестную подпись. Это относится к OpenSSL 1.0.2. Следовательно, программы, работающие в RHEL/CentOS 7 и использующие OpenSSL, скорее всего, не смогут проверить новую цепочку сертификатов или установить соединение TLS. Обновление до более новых версий Openssl на таких платформах не так просто.

Есть несколько вариантов: либо обновить хранилище доверенных сертификатов (удалить корневой сертификат DST Root CA X3 — после его удаления влияние должно быть минимальным) на стороне клиента (или) изменить цепочку сертификатов на стороне сервера.

Для Nginx

Для Nginx есть только один параметр для указания файла сертификата. Вы должны использовать полная цепочка.pem предоставленный certbot, чтобы заставить его работать правильно.

Правильная конфигурация в блоке сервера для данного виртуального хоста будет следующей:

сервер {
  ...
  ssl_certificate /etc/letsencrypt/live/co2-avatar.com/fullchain.pem; -> заменил cert.pem на fullchain.pem
  ssl_certificate_key /etc/letsencrypt/live/co2-avatar.com/privkey.pem;
}

использованная литература

BairDev avatar
флаг cn
Спасибо! Я уже использую файл *fullchain*, точно так же, как `SSLCertificateFile /etc/letsencrypt/live/co2-avatar.com/fullchain.pem`. Таким образом, промежуточный сертификат почему-то отсутствует, что может объяснить сбой `openssl verify -CAfile .../fullchain.pem .../cert.pem`. Как вы видите это: *Чего не хватает промежуточного сертификата*? Я предполагаю, что мне нужно исправить сертификат (ы). Любой намек на это?
флаг in
Ответьте на второй вопрос: команда `openssl s_client ... -showcerts` показывает **все** сертификаты, отправленные сервером. В вашем случае: тот факт, что возвращается только один сертификат, показывает, что промежуточные звенья отсутствуют. Вы можете увидеть это лучше всего, если сравните его с выводом, если вы используете другой домен. Пример для сравнения: эхо | openssl s_client -connect belug.de:443 -имя_сервера belug.de -showcerts` Проверьте, включены ли все ожидаемые сертификаты в ваш файл `fullchain.pem`. (ожидается увидеть там более одного сертификата)
флаг in
Чтобы ответить на ваш первый вопрос: учитывая, что промежуточный сертификат (сертификаты), присутствующий в файле `fullchain.pem` **и** настроенный на вашем виртуальном хосте, но **не** доставленный вашим сервером, убедительно указывает на то, что другой файл виртуального хоста использовал. Проверьте другие файлы конфигурации Apache — могу поспорить, что конфигурация виртуального хоста перекрывается.
BairDev avatar
флаг cn
Хорошо, теперь все директивы SSLCertificateFile в моих файлах conf указывают на *fullchain.pem*. Но второй сертификат именно в этом файле не доставляется. Для чего нужна директива SSLCertificateChainFile (она устарела, верно)? Какая-то другая конфигурация блокирует файл fullchain.pem. (да, я перезапустил apache/httpd)
BairDev avatar
флаг cn
Оказалось, что версия апача слишком низкая/старая(

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

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