Битлента
Сетевые команды и утилиты5 мин чтения·

openssl s_client -connect: как проверить сертификат и защищённое соединение с портом

Как использовать openssl s_client: проверить цепочку сертификатов, срок действия, имя в сертификате и SNI на порту 443 или почтовом порту из терминала.

Кратко

Команда openssl s_client -connect узел:порт открывает защищённое соединение и показывает цепочку сертификатов и результат проверки. Ключ -servername передаёт имя сайта, а openssl x509 выводит срок действия и владельца.

Что умеет s_client и чем он удобен

Утилита openssl входит в состав Linux и macOS. Её подкоманда s_client работает как простейший клиент защищённого соединения: подключается к указанному узлу и порту, выполняет согласование и показывает, что получилось. В отличие от браузера, она не прячет подробности за значком замка и не скрывает цепочку сертификатов.

Поэтому s_client применяют, когда нужно увидеть, какой сертификат отдаёт сервер, когда он перестанет действовать, нет ли в цепочке пропущенных звеньев, поддерживает ли порт защищённое соединение вообще. Подходит он и для проверки не только сайтов: подобным образом проверяют почтовые порты и другие службы со встроенной защитой.

Обычно проще начать с браузера или с curl -v, а к s_client переходят, когда этих сведений мало. Для базовой проверки срока действия сертификата сайта у нас есть отдельная инструкция без командной строки.

Базовая команда и её параметры

Минимальный вариант: openssl s_client -connect example.com:443 -servername example.com. После подключения утилита ждёт ввода, поэтому для автоматического завершения подают пустой ввод: добавьте </dev/null в конец команды.

ПараметрНазначение
-connect узел:портКуда подключаться
-servername имяПередать имя сайта (SNI), чтобы сервер выбрал нужный сертификат
-showcertsПоказать все сертификаты цепочки, а не только первый
-briefКраткий вывод; есть не во всех версиях
-starttls протоколСначала обычное соединение, затем переход к защищённому, нужен для почтовых портов
-verify_return_errorЗавершать соединение при ошибке проверки

Параметр -servername важен: без него сервер, на котором работает несколько сайтов, вернёт сертификат по умолчанию, и вы увидите не тот, что видят посетители. Это самая частая причина «странных» результатов.

В macOS по умолчанию стоит собственная сборка утилиты, и набор ключей у неё может отличаться от Linux. Если ключ не распознан, посмотрите справку командой openssl s_client -help.

Читаем вывод

Вывод длинный, но интересны в нём лишь несколько мест.

  1. Блок Certificate chain. Нумерованные записи: s — субъект, то есть кому выдан сертификат, i — издатель. Запись с номером 0 — сертификат самого сайта, следующие — промежуточные.
  2. Блок Server certificate. Сам сертификат в текстовой форме между строками BEGIN и END.
  3. Строки о версии протокола и наборе шифров. Они показывают, о чём договорились стороны.
  4. Строка Verify return code. Значение 0 с пометкой ok означает, что проверка прошла. Другое значение сопровождается текстом причины.

Типичные причины ошибки проверки: срок действия истёк, цепочка неполная, издатель неизвестен системе. Совпадение имени сайта с именем в сертификате s_client по умолчанию не сверяет: для этого есть отдельный параметр -verify_hostname с именем сайта. Текст рядом с кодом обычно называет причину прямо.

Если цепочка неполная, браузеры могут сглаживать проблему, догружая недостающее звено, а другие клиенты нет. Поэтому сайт откроется у вас в браузере, но у программы или скрипта будет ошибка. Эту разницу s_client показывает отлично.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно

Срок действия, владелец и имя: openssl x509

Чтобы не читать весь вывод, направьте сертификат в команду openssl x509. Типичная строка: echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates -subject -issuer.

  • -dates — дата начала и окончания действия сертификата;
  • -subject — кому выдан;
  • -issuer — кем выдан;
  • -ext subjectAltName — список имён, для которых действует сертификат (ключ есть в новых версиях);
  • -checkend секунды — проверить, не истечёт ли сертификат в ближайшее время.

Ключ -checkend удобен в проверках по расписанию: команда завершается с кодом, по которому видно, истекает ли сертификат в заданный срок. Например, значение 86400 соответствует одним суткам.

Сверяйте дату окончания с текущей датой на компьютере. Если время на вашем устройстве сбито, проверка покажет ложную ошибку: сертификат окажется «ещё не действующим» или «уже просроченным». Это одна из причин, почему при ошибках защищённого соединения советуют начать с проверки даты и времени.

Почтовые порты, диагностика и границы применения

Для служб, которые начинают работу в обычном режиме и затем переходят к защите, нужен ключ -starttls. Например, для почтового сервера отправки используют openssl s_client -connect mail.example.com:587 -starttls smtp, для получения почты — значение imap или pop3 и соответствующий порт. Список поддерживаемых служб есть в справке утилиты.

Порядок действий при ошибке защищённого соединения.

  1. Выполните базовую команду с -servername и найдите Verify return code.
  2. Посмотрите дату окончания сертификата и имена в нём.
  3. Проверьте цепочку: есть ли промежуточные сертификаты.
  4. Повторите проверку с другого компьютера или из другой сети: если результат отличается, причина может быть в сетевом оборудовании по пути.
  5. Сопоставьте результат с сообщением конкретной программы, разбор типичных сообщений есть на страницах про ошибки SSL.

Применяйте утилиту только к своим серверам и общедоступным сайтам в обычных целях проверки. Она ничего не взламывает, но чужие системы без разрешения владельца лучше не исследовать. И помните: успешная проверка показывает только то, что сертификат корректен, а не то, что сам сайт безопасен или надёжен.

Типичные ловушки при проверке

Несколько мелочей часто сбивают с толку. Если команда зависла и ждёт ввода, вы забыли подать пустой ввод: добавьте </dev/null или нажмите Ctrl+D. Если вывод пугающе длинный, это нормально: достаточно искать нужные блоки, а остальное пропускать.

Проверка через s_client может отличаться от браузерной: у браузера собственное хранилище доверенных издателей и собственные правила, а утилита использует системные. Поэтому возможна ситуация, когда сайт открывается в браузере, а openssl жалуется на цепочку.

Не путайте сообщение об ошибке проверки с невозможностью соединения. Если утилита вообще не смогла подключиться, причина в сети или порте, и сначала проверяйте доступность порта простым способом, например командой nc -zv. Только после этого имеет смысл изучать сертификаты. Для длительных наблюдений за сроком действия лучше настроить автоматическую проверку по расписанию.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно
opensslsslсертификатпорты

Часто задаваемые вопросы

Читайте также