Обновлено:

Проверки OpenSSL

openssl s_client полезен, когда нужно проверить не страницу, а сам TLS-слой: сертификат, SNI, ALPN, цепочку, срок действия и listener.

curl отвечает на вопрос “что отдаёт HTTP”.
openssl отвечает на вопрос “как проходит TLS”.

Быстрая проверка публичного TLS

openssl s_client -connect getsrv.app:443 -servername getsrv.app -alpn h2 -brief

Что смотреть:

Protocol version
Ciphersuite
Peer certificate
Verification
ALPN protocol

Нормально:

  • handshake завершается;
  • нет критичной ошибки certificate verification;
  • согласован ожидаемый ALPN;
  • сертификат соответствует имени.

Проверка с выводом сертификата

openssl s_client -connect getsrv.app:443 -servername getsrv.app -showcerts </dev/null

Это покажет цепочку сертификатов. Полезно, если есть подозрение на неправильный fullchain.

Проверить локальный TLS listener

openssl s_client -connect 127.0.0.1:7443 -servername getsrv.app -alpn h2 -brief

Так можно проверить локальный Nginx listener напрямую, без внешнего маршрута.

Если локальная проверка проходит, а публичная нет, проблема может быть выше Nginx: edge listener, маршрутизация, firewall или внешний TLS-слой.

Проверить срок действия сертификата

openssl x509 -in /etc/letsencrypt/live/getsrv.app/fullchain.pem -noout -dates

Пример:

notBefore=...
notAfter=...

Смотрите notAfter. Если дата близко, надо проверить renewal.

Проверить subject и issuer

openssl x509 -in /etc/letsencrypt/live/getsrv.app/fullchain.pem -noout -subject -issuer

subject показывает, на кого выписан сертификат.
issuer показывает, кем он выписан.

Проверить SAN

openssl x509 -in /etc/letsencrypt/live/getsrv.app/fullchain.pem -noout -ext subjectAltName

В SAN должны быть нужные имена.

Пример:

DNS:getsrv.app
DNS:www.getsrv.app

Если имени нет в SAN, браузер будет считать сертификат неподходящим для этого домена.

Проверить сертификат снаружи через SNI

echo | openssl s_client -connect getsrv.app:443 -servername getsrv.app 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

Это проверяет именно сертификат, который отдаётся при подключении к публичному адресу.

Проверить ALPN

openssl s_client -connect getsrv.app:443 -servername getsrv.app -alpn h2,http/1.1 -brief

Если сервер согласует h2, в выводе будет видно ALPN protocol.

Частые признаки проблемы

Certificate verify error

Причины:

  • неполная цепочка;
  • устаревший CA bundle на клиенте;
  • сертификат истёк;
  • проверяется не то имя.

Wrong certificate

Причины:

  • неверный server_name;
  • запрос ушёл не в тот listener;
  • SNI не передался;
  • на одном IP несколько TLS-сервисов, а выбран не тот default.

Local OK, public broken

Если:

openssl s_client -connect 127.0.0.1:7443 -servername getsrv.app -brief

работает, а:

openssl s_client -connect getsrv.app:443 -servername getsrv.app -brief

не работает, проверяйте внешний слой и маршрутизацию до локального Nginx.

Минимальный набор проверки

openssl s_client -connect getsrv.app:443 -servername getsrv.app -alpn h2 -brief
openssl x509 -in /etc/letsencrypt/live/getsrv.app/fullchain.pem -noout -subject -issuer -dates
openssl x509 -in /etc/letsencrypt/live/getsrv.app/fullchain.pem -noout -ext subjectAltName
curl -kI https://getsrv.app/

Если эти команды дают ожидаемый результат, базовый TLS-слой сайта в порядке.