PHP: curl, file_get_contents после удаления DST Root CA X3

После 30 сентября 2021 года Let's Encrypt (бесплатный, автоматизированный и открытый Центр Сертификации) изменил цепочку корневых сертификатов. Цифрового корневой сертификат IdenTrust DST Root CA X3 признан устаревшим и должен быть удалён.

Старая цепочка: domain -> R3 -> ISRG Root X1 -> DST Root CA X3

Новая цепочка: domain -> R3 -> ISRG Root X1

Если вы попытаетесь зайти на сайт (на котором установлен Let`s Encrypt SSL сертификат) с устаревшего устройства после 30 сентября 2021, то получите ошибку Сайт не может обеспечить безопасное соединение.

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

Например, в случае с php (если указано своё хранилище корневых сертификатов) curl вернёт ошибку certificate has expired, а file_get_contents - false.

Если вы попытаетесь воспользоваться консольной утилитой wget, то получите ошибку: ОШИБКА: cannot verify letsencrypt.org's certificate, issued by «/C=US/O=Let's Encrypt/CN=R3»: Для запрошенного сертификата истёк срок действия.

Решение проблемы заключается в обновлении ПО устаревших устройств.

https://letsencrypt.org/docs/certificate-compatibility/ - совместимость сертификатов LE с различными платформами.

https://access.redhat.com/solutions/1549003 - как сбросить список доверенных CA сертификатов в RHEL 6+

30 сентября обновилось хранилище сертификатов CA Mozilla. Стало на 1 сертификат меньше:

30 сентября обновилось хранилище сертификатов CA Mozilla. Стало на 1 сертификат меньше

Если сравним файлы от 30.09.21 и 05.07.21, то увидим, что был удалён именно сертификат DST Root CA X3:

Если сравним файлы от 30.09.21 и 05.07.21, то увидим, что был удалён именно сертификат DST Root CA X3

# 1. Для исключения сертификата DST Root CA X3 на уровне сервера следует:
# добавить сертификат в черный список 
trust dump --filter "pkcs11:id=%c4%a7%b1%a4%7b%2c%71%fa%db%e1%4b%90%75%ff%c4%15%60%85%89%10" | openssl x509 | sudo tee /etc/pki/ca-trust/source/blacklist/DST-Root-CA-X3.pem

# обновить корневые сертификаты (с учётом черного списка)
sudo update-ca-trust


# 2. Для восстановления работы curl, file_get_contents требуется указать новые сертификаты в php.ini
# скачать последнюю версию CA и разместить в каталоге /etc/ssl/certs/
# https://curl.se/docs/caextract.html
wget https://curl.se/ca/cacert.pem -O /etc/ssl/certs/cacert.pem

# обновить пути к файлу в php.ini (путь к файлу зависит от конфигурации)
mcedit /etc/php.ini

# укажите путь до нового файла
curl.cainfo = /etc/ssl/certs/cacert.pem
openssl.cafile = /etc/ssl/certs/cacert.pem

# релоад php-fpm
systemctl reload php-fpm


PHP CentOSnginx up: просмотров: 1.2k