Перейти к содержимому
EN
← Все статьи

openssl s_client: 30 проверенных команд для диагностики TLS

Коротко:

Для проверки TLS запустите openssl s_client -connect enterno.io:443 -servername enterno.io -verify_hostname enterno.io -verify_return_error -brief -no-interactive. SNI выбирает сертификат на сервере, а -verify_hostname и -verify_return_error делают проверку имени и цепочки строгой.

Схема TLS-рукопожатия между клиентом и сервером с проверкой сертификата
TLS-рукопожатие: проверяйте цепочку сертификата и ожидаемое имя.

Ниже — 30 команд, выполненных 13 ноября 2026 года на публичных адресах. Это карта диагностики, а не обещание одинакового вывода на любом сервере. Коды и фрагменты взяты из сохранённого запуска; динамические сертификаты и настройки могут измениться.

Что понадобится

OpenSSL с командой s_client, доступ к нужному TCP-порту и имя хоста, которое ожидает клиент. Замер сделан на OpenSSL 3.5.8; опция -no-interactive проверена именно в этой версии. Если ваша сборка её не знает, уберите эту опцию и завершайте ввод через </dev/null.

Шаг 1. Проверьте сертификат, цепочку и имя

Начните со строгой команды из начала статьи. Обычный s_client показывает ошибку проверки, но по умолчанию может продолжить соединение; это прямо описано в руководстве OpenSSL. Флаг -verify_return_error прерывает рукопожатие при ошибке проверки, а -verify_hostname сравнивает сертификат с ожидаемым DNS-именем. -servername отвечает за SNI и сам по себе имя не проверяет.

$ openssl s_client -connect enterno.io:443 -servername enterno.io -verify_hostname wrong.example -verify_return_error -no-interactive
Verification error: hostname mismatch
Verify return code: 62 (hostname mismatch)
# exit 1
№ЗадачаКомандаФрагмент выводаexit
1Базовый обмен и код проверкиopenssl s_client -connect enterno.io:443 -servername enterno.io -no-interactiveVerify return code: 0 (ok)0
2Краткий итог рукопожатияopenssl s_client -connect enterno.io:443 -servername enterno.io -brief -no-interactiveProtocol version: TLSv1.30
3Цепочка, присланная серверомopenssl s_client -connect enterno.io:443 -servername enterno.io -showcerts -no-interactiveCertificate chain0
4Остановиться на ошибке цепочкиopenssl s_client -connect enterno.io:443 -servername enterno.io -verify_return_error -no-interactiveVerify return code: 0 (ok)0
5Проверить имя enterno.ioopenssl s_client -connect enterno.io:443 -servername enterno.io -verify_hostname enterno.io -verify_return_error -no-interactiveVerify return code: 0 (ok)0
6Поймать несовпадение имениopenssl s_client -connect enterno.io:443 -servername enterno.io -verify_hostname wrong.example -verify_return_error -no-interactiveVerification error: hostname mismatch1
7Краткий итог со строгой проверкойopenssl s_client -connect enterno.io:443 -servername enterno.io -brief -verify_return_error -no-interactiveProtocol version: TLSv1.30
8Запросить OCSP staplingopenssl s_client -connect enterno.io:443 -servername enterno.io -status -no-interactiveOCSP response: no response sent0

-showcerts показывает сертификаты, которые прислал сервер; это не доказательство полной доверенной цепочки. В замере -status дал OCSP response: no response sent: сервер не прислал stapled-ответ на этот запрос, но один этот факт не доказывает отзыв сертификата. Для срока действия конкретного сертификата сохранённый вывод -showcerts можно передать в openssl x509 -noout -dates; прежде убедитесь, что извлекли именно leaf-сертификат.

Подробности: проверка сертификата, типы сертификатов и этапы TLS-рукопожатия.

Шаг 2. Ограничьте версию TLS, ALPN и параметры обмена

Для проблемы совместимости проверьте TLS 1.2 и 1.3 отдельно. В нашем соединении обе версии работают. Попытка TLS 1.1 завершилась ещё в локальной библиотеке строкой no protocols available; из неё нельзя заключить, разрешает ли сервер TLS 1.1. Verify return code: 0 (ok) в таком неуспешном выводе не означает успешное рукопожатие.

$ openssl s_client -connect enterno.io:443 -servername enterno.io -tls1_1 -no-interactive
error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available
# exit 1
№ЗадачаКомандаФрагмент выводаexit
9Только TLS 1.2openssl s_client -connect enterno.io:443 -servername enterno.io -tls1_2 -no-interactiveProtocol : TLSv1.20
10Только TLS 1.3openssl s_client -connect enterno.io:443 -servername enterno.io -tls1_3 -no-interactiveProtocol : TLSv1.30
11Проверить старый TLS 1.1openssl s_client -connect enterno.io:443 -servername enterno.io -tls1_1 -no-interactive40A7D934457F0000:error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available:ssl/statem/s1
12Исключить TLS 1.3openssl s_client -connect enterno.io:443 -servername enterno.io -no_tls1_3 -no-interactiveProtocol : TLSv1.20
13Предложить h2 и HTTP/1.1openssl s_client -connect enterno.io:443 -servername enterno.io -alpn h2,http/1.1 -no-interactiveALPN protocol: h20
14Предложить HTTP/1.1openssl s_client -connect enterno.io:443 -servername enterno.io -alpn http/1.1 -no-interactiveALPN protocol: http/1.10
15Предложить h2openssl s_client -connect enterno.io:443 -servername enterno.io -alpn h2 -no-interactiveALPN protocol: h20
16Ограничить шифр TLS 1.3openssl s_client -connect enterno.io:443 -servername enterno.io -tls1_3 -ciphersuites TLS_AES_128_GCM_SHA256 -no-interactiveNew, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA2560
17Предложить X25519openssl s_client -connect enterno.io:443 -servername enterno.io -groups X25519 -no-interactiveexit 00
18Предложить P-256openssl s_client -connect enterno.io:443 -servername enterno.io -groups P-256 -no-interactiveexit 00

С -alpn h2,http/1.1 сервер выбрал h2, а при предложении только http/1.1 — его. Без -alpn вывод был No ALPN negotiated; это поведение клиента в данном тесте, не отсутствие HTTP/2 на сервере. -groups ограничивает предлагаемые группы, -ciphersuites — наборы TLS 1.3. Их успех говорит только о конкретном сочетании клиента и сервера.

Если проблема возникает только в браузере, сопоставьте выбор ALPN с HTTP/2 и HTTP/3. Общую схему протокола даёт руководство по SSL/TLS.

Выбор виртуального TLS-хоста и сертификата по SNI
SNI выбирает сертификат на сервере; имя проверяется отдельно.

Шаг 3. Отделите выбор виртуального хоста от проверки сертификата

На одном IP могут работать разные TLS-хосты. Мы подключились к 81.163.20.249:443 с SNI enterno.io и получили проверяемый сертификат сайта. Без SNI тот же адрес выдал TRAEFIK DEFAULT CERT, самоподписанный. Команда без строгой проверки при этом завершилась с exit 0 — важный аргумент против проверки по одному коду процесса.

$ openssl s_client -connect enterno.io:443 -noservername -no-interactive
subject=CN=TRAEFIK DEFAULT CERT
Verify return code: 18 (self-signed certificate)
# exit 0
№ЗадачаКомандаФрагмент выводаexit
19Подключиться без SNIopenssl s_client -connect enterno.io:443 -noservername -no-interactivesubject=CN=TRAEFIK DEFAULT CERT0
20Подключиться к IP с SNI и проверкой имениopenssl s_client -connect 81.163.20.249:443 -servername enterno.io -verify_hostname enterno.io -verify_return_error -no-interactiveVerified peername: enterno.io0
21Подключиться к IP без SNIopenssl s_client -connect 81.163.20.249:443 -noservername -verify_hostname enterno.io -verify_return_error -no-interactiveVerification error: self-signed certificate1
22Принудительно IPv4openssl s_client -connect enterno.io:443 -servername enterno.io -4 -no-interactiveConnecting to 81.163.20.2490
23Показать состояния TLSopenssl s_client -connect enterno.io:443 -servername enterno.io -state -no-interactiveSSL_connect:SSLv3/TLS read server session ticket0
24Показать расширения сервераopenssl s_client -connect enterno.io:443 -servername enterno.io -tlsextdebug -no-interactiveTLS server extension "server name" (id=0), len=00
25Повторить сводку при выходеopenssl s_client -connect enterno.io:443 -servername enterno.io -prexit -no-interactiveVerify return code: 0 (ok)0
26Проверить повторные соединенияopenssl s_client -connect enterno.io:443 -servername enterno.io -reconnect -no-interactiveexit 00

При подключении к IP используйте -servername для выбора виртуального хоста и -verify_hostname для проверки сертификата. -state и -tlsextdebug полезны, когда рукопожатие оборвалось раньше сводки. -reconnect показывает поведение повторных соединений; не считайте его отдельным тестом валидности сертификата.

Шаг 4. Воспроизведите ошибки и STARTTLS

На тестовых доменах badssl.com строгая проверка прервала обмен из-за истёкшего, самоподписанного и не подходящего по имени сертификата. Отдельно проверен SMTP STARTTLS: -starttls smtp сначала выполняет протокольный переход, затем TLS. Это не тот же сценарий, что прямой TLS на порту 465.

№ЗадачаКомандаФрагмент выводаexit
27Просроченный сертификатopenssl s_client -connect expired.badssl.com:443 -servername expired.badssl.com -verify_return_error -no-interactiveVerification error: certificate has expired1
28Самоподписанный сертификатopenssl s_client -connect self-signed.badssl.com:443 -servername self-signed.badssl.com -verify_return_error -no-interactiveVerification error: self-signed certificate1
29Чужое имя в сертификатеopenssl s_client -connect wrong.host.badssl.com:443 -servername wrong.host.badssl.com -verify_hostname wrong.host.badssl.com -verify_return_error -no-interactiveVerification error: hostname mismatch1
30Проверить SMTP STARTTLSopenssl s_client -starttls smtp -connect smtp.gmail.com:587 -servername smtp.gmail.com -verify_hostname smtp.gmail.com -verify_return_error -no-interactiveVerified peername: smtp.gmail.com0

Проверка и следующий шаг

Успешный результат для конкретного имени: exit 0, Verification: OK, Verified peername при заданном -verify_hostname, ожидаемая версия TLS и, если важен HTTP/2, согласованный ALPN. Если нужен быстрый взгляд на срок, цепочку и конфигурацию HTTPS без ручного чтения дампа, запустите проверку SSL на enterno; ручной вывод остаётся источником деталей рукопожатия.

Если не получилось

СимптомЧто означает в этом тестеСледующий шаг
hostname mismatchИмя не найдено в сертификатеСверить -servername и -verify_hostname
self-signed certificateЦепочка не доверена этой системеПроверить SNI и цепочку CA
no protocols availableКлиент не начал обмен с этой версиейПроверить политику OpenSSL и доступные версии
No ALPN negotiatedПротокол не выбран в данном обменеПовторить с явным -alpn h2,http/1.1
OCSP response: no response sentНет stapled-ответа в этом соединенииПроверять статус сертификата отдельным способом

Как сделан материал

13 ноября 2026 года скрипт method.py выполнил 30 команд с OpenSSL 3.5.8 на Linux-сервере. Для каждой сохранены точный argv, stdout, stderr и exit code. Целевые хосты: публичные enterno.io, badssl.com и smtp.gmail.com. Фрагменты таблицы сокращены; полный вывод находится в данных исследования. Текст подготовлен с помощью AI на данных проверок; технические выводы сверены с сохранённым выводом и документацией OpenSSL.

Частые вопросы

Почему s_client вернул exit 0 при ошибке сертификата?

По умолчанию диагностический клиент может продолжить обмен после ошибки проверки. На нашем тесте без SNI это произошло; добавьте -verify_return_error.

Достаточно ли -servername для проверки домена?

Нет. Этот параметр отправляет SNI; ожидаемое имя для проверки задаёт -verify_hostname.

Как увидеть сертификаты сервера?

Добавьте -showcerts. Команда показывает присланную цепочку, а не все локальные доверенные корни.

Почему TLS 1.1 не подключился?

В нашем запуске библиотека OpenSSL отказалась начать такой обмен. По этому тесту нельзя оценить политику сервера.

Источники

Проверьте ваш сайт прямо сейчас

Проверить SSL своего сайта →
Другие статьи: SSL/TLS
SSL/TLS
Сертификат Минцифры: как установить и вернуть доступ к банкам
31.08.2026 · 4 876 просм.
SSL/TLS
Подключение не защищено: что значит и как исправить ошибку
23.09.2026 · 4 109 просм.
SSL/TLS
SSL Handshake Failed: причины ошибки и пошаговая диагностика
15.04.2026 · 3 934 просм.
SSL/TLS
ERR_CERT_AUTHORITY_INVALID: что значит и как исправить ошибку
13.07.2026 · 3 774 просм.