Иногда приложение на Linux-сервере не может подключиться к внешнему ресурсу из-за проблем с доверием к сертификату, в этой статье мы разберем как проверить ssl сертификат. Здесь не только команды, но и полный процесс диагностики и исправления ситуации когда в системе нет нужного CA и промежуточного сертификата.
🕒 4 мин.
Проверка даты окончания сертификата
Самое простое, что вы можете проверить, это дату окончания сертификата. Делается это с помощью утилиты openssl.
Вот так можно проверить дату окончания сертификата:
# echo | openssl s_client -connect example.com:443 \ -servername example.com 2>/dev/null | \ openssl x509 -noout -enddate notAfter=May 14 18:57:50 2026 GMT
- Сравните полученную дату с системным временем, иногда проблема кроется в неверном времени на сервере.
Проверка сертификата на ошибки
С помощью openssl мы также можем проверить сертификат сайта на ошибки:
# openssl s_client -connect example.com:443 \ </dev/null | \ grep Verification
Ответ может быть с ошибкой:
- Verification error: unable to verify the first certificate (не удалось проверить первый сертификат). Ошибка в цепочке SSL.
Или без ошибки:
- Verification: OK
Ошибка «Verification error: unable to verify the first certificate»
Эта ошибка означает, что нет доверия ко всей цепочке сертификатов.
Иногда это некорректно настроенный web-сервер, который не отправляет файл с полной цепочкой сертификатов (файл fullchain.crt).
- То есть на web-сервере нужно было настроить так:
ssl_certificate /<путь>/fullchain.cer; ssl_certificate_key /<путь>/example.com.key;
- А не так:
ssl_certificate /<путь>/example.com.cer; ssl_certificate_key /<путь>/example.com.key;
Либо ошибка в том, что на вашей системе нет нужного CA или промежуточного сертификата. Об этом ниже.
Диагностика на примере npchk.nalog.ru
Для теста я взял старую систему: Ubuntu 18.04 и попробовал проверить сертификат на сайте npchk.nalog.ru.
Проверяем сертификат на ошибки:
# openssl s_client -connect npchk.nalog.ru:443 \ </dev/null | \ grep Verification depth=0 CN = *.nalog.ru verify error:num=20:unable to get local issuer certificate <--Ошибка (нет цепочки сертификата) verify return:1 depth=0 CN = *.nalog.ru verify error:num=21:unable to verify the first certificate verify return:1 Verification error: unable to verify the first certificate
- Понимаем что цепочка сертификатов не проходит проверку.
- Проблема возникла потому, что система Ubuntu 18.04 содержит CA сертификаты, актуальные на 2018 год. А промежуточный сертификат этого сайта выпущен в 2020 году.
Если бы система была актуальнее, то помогло бы обновление корневых сертификатов:
# apt install ca-certificates
Но в нашем случае, чтобы исправить проблему нам нужно скачать промежуточный и корневой сертификат.
Для начала узнаём ссылку на промежуточный сертификат. Она всегда есть внутри самого сертификата в расширении Authority Information Access (AIA). Нужно просто правильно распарсить сертификат через openssl x509 -text.
# openssl s_client -connect npchk.nalog.ru:443 \
</dev/null | \
openssl x509 -noout -text | \
grep "CA Issuers"
depth=0 CN = *.nalog.ru
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = *.nalog.ru
verify error:num=21:unable to verify the first certificate
verify return:1
CA Issuers - URI:http://secure.globalsign.com/cacert/gsgccr3dvtlsca2020.crt
- Мы получили ссылку на промежуточный сертификат.
Скачиваем промежуточный сертификат и преобразовываем его в формат pem:
# wget http://secure.globalsign.com/cacert/gsgccr3dvtlsca2020.crt -O globalsign-intermediate.crt # openssl x509 -inform DER -in globalsign-intermediate.crt -out globalsign-intermediate.pem
Смотрим кто издатель промежуточного сертификата:
# openssl x509 -in globalsign-intermediate.pem -noout -issuer issuer=OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
- Видим корневой сертификат: GlobalSign Root CA — R3.
Скачиваем корневой сертификат, для GlobalSign Root CA — R3 это общеизвестная ссылка (можно найти на официальном сайте):
# wget https://secure.globalsign.net/cacert/Root-R3.crt -O globalsign-root.crt # openssl x509 -inform DER -in globalsign-root.crt -out globalsign-root.pem
Проверяем цепочку полученных двух сертификатов:
# openssl verify -CAfile globalsign-root.pem globalsign-intermediate.pem globalsign-intermediate.pem: OK
Кидаем файлы сертификатов в хранилище:
# cp globalsign-root.pem /usr/local/share/ca-certificates/globalsign-root.crt # cp globalsign-intermediate.pem /usr/local/share/ca-certificates/globalsign-intermediate.crt
- Формат должен быть pem, но расширение crt — обязательно.
Обновляем хранилище доверия:
# update-ca-certificates --fresh
Проверяем:
# openssl s_client -connect npchk.nalog.ru:443 \ </dev/null | \ grep Verification depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign verify return:1 depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign GCC R3 DV TLS CA 2020 verify return:1 depth=0 CN = *.nalog.ru verify return:1 Verification: OK
Вывод
В статье я продемонстрировал как проводить диагностику SSL сертификатов при подключении к ресурсам с сервера Linux. Это бывает полезно, когда, какое-нибудь приложение не может подключиться к какому-нибудь ресурсу и ругается на проверку сертификата удалённого узла.
В итоге:
- Проверяем дату окончания сертификата и сравниваем с текущим временем в системе.
- Проверяем доверие к цепочке сертификатов.
- При необходимости добавляем в систему корневые и промежуточные сертификаты.
Предупреждение! В статье корневой сертификат был от GlobalSign, это известный поставщик сертификатов. Не известные корневые сертификаты лучше не использовать, иначе ваша система может начать доверять тем ресурсам, которым не следует.
Если понравилась статья, подпишись на мой канал в VK или Telegram.