Как проверить SSL сертификат сайта из консоли Linux

Иногда приложение на 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.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности