Как пользоваться s_client
Команда s_client выполняет функции SSL/TLS клиента для подключения к удалённому хосту с использованием SSL/TLS. Данная программа позволяет подключаться с различными настройками SSL/TLS — выбирать используемые шифры, версию рукопожатия, использовать определённые протоколы, тестировать повторное использование сессий. При этом программа показывает все переданные и полученные во время SSL/TLS подключения данные. Благодаря этому возможна доскональная проверка настроек сервера SSL/TLS, тестирование списка отзыва сертификатов и даже проверка на уязвимости.
Выполнив SSL/TLS подключение, s_client позволяет вводить данные, например, отправлять заголовки HTTP протокола, команды SMTP, FTP и т.д.
Для подключения к удалённому хосту укажите адрес домена и порт (обычно это 443) с опцией -connect:
openssl s_client -connect yandex.ru:443
Вы увидите:
1. верификацию и цепочку сертификатов
2. сертификат сайта
3. данные текущей сессии — SSL/TLS (ассиметричное шифрование) используются для обмена ключом для симметричного шифрования, поскольку ассиметричное слишком «затратное». И фактический шифрование данных будет выполняться «паролем» (ключами сессии, а не сертификатом). Эти ключи меняются при каждой новой сессии.
То есть, компрометация приватного ключа сервера ≠ расшифровка трафика. Поскольку необходимо знать все ключи сессии. Раньше, зная приватный ключ сервера, можно было расшифровать SSL трафик — сначала расшифровывались ключи сессии, а затем они использовались для расшифровки данных. Но теперь используется Perfect Forward Secrecy (которая применяет Diffie-Hellman key exchange (DH)), что привело к тому, что третья сторона, даже зная приватный ключ RSA (приватный ключ сервера), не сможет расшифровать TLS трафик.
Как видеть все сертификаты, которые отправляет HTTPS сервер
В предыдущем выводе вы могли обратить внимание, что он содержит сертификат сайта. На самом деле, сервер обычно отправляет цепочку сертификатов — сертификат сайта и все сертификаты промежуточных Центров Сертификации. Чтобы увидеть все сертификаты, которые отправил сервер, используйте опцию -showcerts:
openssl s_client -showcerts -connect yandex.ru:443
Для yandex.ru будет выведено 3 сертификата: 1 сертификат сайта и 2 промежуточных.
Если вам нужно только сертификаты, то используйте следующую конструкцию, чтобы программа не ждала ввода данных:
openssl s_client -showcerts -connect yandex.ru:443 </dev/null
Чтобы сохранить сертификат сайта в файл используйте следующую команду (дважды замените w-e-b.site на интересующий вас домен):
echo | openssl s_client -connect w-e-b.site:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > w-e-b.site.crt
Если вы хотите сохранить всю присылаемую цепочку сертификатов, то сделайте так (дважды замените w-e-b.site на интересующий вас домен):
echo | openssl s_client -showcerts -connect w-e-b.site:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > w-e-b.site.ca-bundle
Проверка TLS/SSL веб-сайта с указанием Центра Сертификации
Если веб-сайт использует самостоятельно созданный сертификат, который не подписан Глобальными Центрами Сертификации, то с помощью опции -CAfile можно указать сертификат того CA, который вы использовали для подписи:
openssl s_client -connect w-e-b.site:443 -CAfile /etc/ssl/CA.crt
Это подходит, например, для тестирования сгенерированных сертификатов на локальном сервере без добавления самодельного CA в корневые Центры Сертификации ОС.
Тестирование протоколов, которые обновляются до SSL
При использовании с HTTP TLS оборачивает весь текстовый канал связи в HTTPS. Некоторые другие протоколы начинаются как открытый текст, но затем они переходят на шифрование. Если вы хотите протестировать такой протокол, вам нужно сообщить OpenSSL, какой это протокол, чтобы он мог обновляться от вашего имени. Укажите информацию о протоколе с помощью ключа -starttls. Например:
openssl s_client -connect gmail-smtp-in.l.google.com:25 -starttls smtp
Поддерживаются в частности следующие протоколы: smtp, pop3, imap, ftp и xmpp.
Отладка SSL/TLS к HTTPS
Во время установки соединения SSL/TLS «под капотом» выполняется много работы. Если у нас есть какие-то проблемы или нам нужна подробная информация об инициализации SSL/TLS, мы можем использовать опцию -tlsextdebug, как показано ниже.
openssl s_client -connect w-e-b.site:443 -tlsextdebug
Как проверить, поддерживает ли HTTPS сервер определённый протокол
По умолчанию s_client будет пытаться использовать лучший протокол для связи с удаленным сервером и сообщать согласованную версию в выходных данных.
Protocol : TLSv1.3
Если вам нужно протестировать поддержку определённых версий протокола, у вас есть два варианта. Вы можете явно выбрать один протокол для тестирования, указав один из ключей --ssl3, -tls1, -tls1_1, -tls1_2 или -tls1_3. Кроме того, вы можете выбрать протоколы, которые вы не хотите тестировать, используя один или несколько из следующих параметров: -no_ssl3, -no_tls1, -no_tls1_1, -no_tls1_2 или -no_tls1_3.
Примечание: не все версии OpenSSL поддерживают все версии протокола. Например, более старые версии OpenSSL не будут поддерживать TLS 1.2 и TLS 1.3, а более новые версии могут не поддерживать более старые протоколы, такие как SSL 2 и SSL 3. К примеру, при попытке использовать опцию -ssl3 на современных версиях OpenSSL возникает ошибка:
s_client: Option unknown option -ssl3
Интерактивные запросы с s_client
Как вы можете увидеть, подключение с помощью s_client не прекращается до истечении таймаута — программа и сервер ожидают ввод данных.
К примеру, выполним подключение:
openssl s_client -connect w-e-b.site:443
И введём:
HEAD / HTTP/1.1 Host: w-e-b.site User-Agent: fucking best browser ever
Вместо HTTP метода GET использовался HEAD — в результате показана не страница, а только HTTP заголовки.
Получение HTML кода страницы (пример использования метода GET с запросом адреса страницы):
GET /?act=my-user-agent HTTP/1.1 Host: w-e-b.site User-Agent: fucking best browser ever
Для глубокого понимания OpenSSL смотрите также полное руководство: «OpenSSL: принципы работы, создание сертификатов, аудит».
Связанные статьи:
- Бесплатное получение и настройка автоматического продления действительных сертификатов SSL (59.2%)
- Как получить бесплатный SSL сертификат COMODO (59.2%)
- Как настроить HTTPS на Apache в Debian, Ubuntu, Linux Mint, Kali Linux (55%)
- Ошибка «Error code: SSL_ERROR_RX_RECORD_TOO_LONG» (РЕШЕНО) (55%)
- Ошибка «ERR_SSL_PROTOCOL_ERROR» (РЕШЕНО) (55%)
- Как верифицировать сертификат SSL (RANDOM - 2.3%)