Проверки 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-слой сайта в порядке.