[Перевод] Привет, Telnet! И пока. Команда OpenSSL s_client для зашифрованных соединений

z7eufowg6lfvawl6yec3ahtpm9q.png

Изображение:   JanBaby, via Pixabay CC0

Сетевая утилита telnet на слуху. Её в своё время очень активно использовало подавляющее большинство системных администраторов и прочих любителей удалённого администрирования серверов. Утилита позволяет получить доступ к портам удалённого хоста, пройти процедуру авторизации и запускать команды на этой машине.

Но протокол telnet не использует шифрование. В сегодняшних реалиях жертвовать безопасностью — непозволительная роскошь. Однако, есть ряд задач, которые telnet с переменным успехом может выполнять: тестирование сети, проверка портов, а также взаимодействие с IoT устройствами и роутерами. 

Казалось бы, утилиту можно легко использовать, как продвинутую версию ping. Сама по себе, команда ping в лучшем случае всего лишь проверяет доступность хоста (иногда эту команду вообще не получится использовать, например, из-за ограничений политики доступа). А вот команда telnet не только проверяет, открыт ли порт, но и может взаимодействовать с сетевыми службами через этот порт. Но со временем мы всё чаще будет сталкиваться с необходимостью использовать зашифрованное соединение, где telnet вновь окажется бессилен.

OpenSSL и команда s_client


Поэтому в большинстве случаев вместо telnet я использую команду s_client из библиотеки OpenSSL. Команда s_client выполняет функции SSL/TLS клиента для подключения к удалённому хосту с различными настройками — ключ шифрования, вид рукопожатия, протокол и так далее. Команда также позволяет проверить, происходит ли возобновление сеанса.

Установка OpenSSL


Если библиотека OpenSSL ещё не установлена на вашей ОС, то её можно установить с помощью менеджера пакетов:
$ sudo dnf install openssl

Для Debian и некоторых других ОС команда будет выглядеть так:

$ sudo apt install openssl

После установки библиотека должна откликаться на эту команду:

$ openssl version

OpenSSL x.y.z FIPS

Проверка доступа к порту


Так работает команда telnet для проверки доступа к порту номер 25:
$ telnet mail.example.com 25

Trying 98.76.54.32...

Connected to example.com.

Escape character is '^]'.

В примере выше мы открыли интерактивный сеанс с неким почтовым сервером, который слушает 25-й порт. Если мы получим к нему доступ, то сможем обмениваться с ним сообщениями. Если порт 25 окажется недоступен, соединение не будет установлено. 

Теперь посмотрим, как работает аналогичная команда из OpenSSL:  

$ openssl s_client -connect example.com:80

CONNECTED(00000003)

140306897352512:error:1408F10B:SSL [...]

no peer certificate available

No client certificate CA names sent

SSL handshake has read 5 bytes and written 309 bytes

Verification: OK

New, (NONE), Cipher is (NONE)

Secure Renegotiation IS NOT supported

Compression: NONE

Expansion: NONE

No ALPN negotiated

Early data was not sent

Verify return code: 0 (ok)

Как видим, не было отправки данных об SSL-сертификате, поэтому подключение было прервано, открыть сеанс не удалось. Чтобы установить безопасное зашифрованное соединение по протоколу HTTPS, нужно обращаться к специальному порту.

Открываем интерактивный сеанс с зашифрованным подключением


В этом случае браузеры и веб-серверы взаимодействуют таким образом, что трафик, направленный на порт 80, фактически перенаправляется на порт 443, зарезервированный для HTTPS-трафика. Зная это, вы можете с любой веб-службой, которая слушает порт 443.

Сначала подключимся к порту с помощью SSL. Используем опцию -showcerts, и SSL-сертификат будет распечатан на вашем терминале:

$ openssl s_client -connect example.com:443 -showcerts

[...]

    0080 — 52 cd bd 95 3d 8a 1e 2d-3f 84 a0 e3 7a c0 8d 87   R...=..-?...z...

    0090 — 62 d0 ae d5 95 8d 82 11-01 bc 97 97 cd 8a 30 c1   b.............0.

    00a0 — 54 78 5c ad 62 5b 77 b9-a6 35 97 67 65 f5 9b 22   Tx\.b[w..5.ge..»

    00b0 — 18 8a 6a 94 a4 d9 7e 2f-f5 33 e8 8a b7 82 bd 94   ..j...~/.3......

    Start Time: 1619661100

    Timeout   : 7200 (sec)

    Verify return code: 0 (ok)

    Extended master secret: no

    Max Early Data: 0

-

read R BLOCK

Нам удалось открыть интерактивный сеанс. Пока он не закрылся, мы можем отправлять на сервер HTTP-сообщения:
[...]

GET / HTTP/1.1

HOST: example.com

Дважды нажмём клавишу Return (для MacOS) или ENTER (для Windows), и получим от сервера ответ в виде example.com/index.html:
[...]



    

Example Domain

    

This domain is for use in illustrative examples in documents. You may use this     domain in literature without prior coordination or asking for permission.

    

More information...


Почтовый сервер


Команду s_client можно использовать для тестирования зашифрованного соединения с почтовым сервером. Чтобы это работало, нам понадобится  имя пользователя и пароль (в моём случае — для тестового пользователя), закодированные в Base64.

Закодировать их можно, например, так:

$ perl -MMIME::Base64 -e 'print encode_base64(«username»);'

$ perl -MMIME::Base64 -e 'print encode_base64(«password»);'

Если всё пройдёт успешно, можно переходить к следующему шагу — подключение к почтовому серверу через SSL. Обычно используется порт 587:
$ openssl s_client -starttls smtp \

-connect email.example.com:587

> ehlo example.com

> auth login

##paste your user base64 string here##

##paste your password base64 string here##

> mail from: noreply@example.com

> rcpt to: admin@example.com

> data

> Subject: Test 001

This is a test email.

.

> quit

Я ввёл адрес почты admin@example.com, на который я ожидаю получить тестовое сообщение от почтового сервера.

Неоправданный риск


Кто-то всё ещё использует telnet, но это уже не тот незаменимый инструмент, которым он когда-то был. Теперь во многих системах он классифицирован как «устаревший» пакет. Некоторые системные администраторы недоумевают, почему он исключён из установки по умолчанию. Telnet постепенно теряет актуальность. Это объективный процесс. 

Сетевая безопасность жизненно необходима для большинства систем, поэтому стоит разобраться с соответствующими инструментами. Важно, что они способны работать с защищёнными подключениями.  Так что во время тестирования или устранения неполадок не придётся отключать защиту системы и рисковать безопасностью.


Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

et1aypandyuamqprsz3m2ntm4ky.png

© Habrahabr.ru