Что умеет 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.
Читаем вывод
Вывод длинный, но интересны в нём лишь несколько мест.
- Блок Certificate chain. Нумерованные записи: s — субъект, то есть кому выдан сертификат, i — издатель. Запись с номером 0 — сертификат самого сайта, следующие — промежуточные.
- Блок Server certificate. Сам сертификат в текстовой форме между строками BEGIN и END.
- Строки о версии протокола и наборе шифров. Они показывают, о чём договорились стороны.
- Строка 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 и соответствующий порт. Список поддерживаемых служб есть в справке утилиты.
Порядок действий при ошибке защищённого соединения.
- Выполните базовую команду с -servername и найдите Verify return code.
- Посмотрите дату окончания сертификата и имена в нём.
- Проверьте цепочку: есть ли промежуточные сертификаты.
- Повторите проверку с другого компьютера или из другой сети: если результат отличается, причина может быть в сетевом оборудовании по пути.
- Сопоставьте результат с сообщением конкретной программы, разбор типичных сообщений есть на страницах про ошибки SSL.
Применяйте утилиту только к своим серверам и общедоступным сайтам в обычных целях проверки. Она ничего не взламывает, но чужие системы без разрешения владельца лучше не исследовать. И помните: успешная проверка показывает только то, что сертификат корректен, а не то, что сам сайт безопасен или надёжен.
Типичные ловушки при проверке
Несколько мелочей часто сбивают с толку. Если команда зависла и ждёт ввода, вы забыли подать пустой ввод: добавьте </dev/null или нажмите Ctrl+D. Если вывод пугающе длинный, это нормально: достаточно искать нужные блоки, а остальное пропускать.
Проверка через s_client может отличаться от браузерной: у браузера собственное хранилище доверенных издателей и собственные правила, а утилита использует системные. Поэтому возможна ситуация, когда сайт открывается в браузере, а openssl жалуется на цепочку.
Не путайте сообщение об ошибке проверки с невозможностью соединения. Если утилита вообще не смогла подключиться, причина в сети или порте, и сначала проверяйте доступность порта простым способом, например командой nc -zv. Только после этого имеет смысл изучать сертификаты. Для длительных наблюдений за сроком действия лучше настроить автоматическую проверку по расписанию.