Подробный гайд: Как проверить совместимость Cipher Suites
Материал актуален для 2024–2026 гг. и учитывает современные стандарты (TLS 1.2/1.3, отключение legacy-алгоритмов, рекомендации Mozilla/NIST).
1. Что такое Cipher Suites и зачем проверять совместимость?
Cipher Suite – это предопределённый набор криптографических алгоритмов, используемых при установлении защищённого соединения TLS/SSL. Каждый набор содержит:
- Алгоритм обмена ключами (Key Exchange)
- Алгоритм аутентификации сервера/клиента
- Симметричный шифр (Encryption)
- Алгоритм целостности (MAC или AEAD)
Зачем проверять:
- Убедиться, что клиент и сервер могут договориться о безопасном наборе.
- Исключить поддержку уязвимых алгоритмов (RC4, 3DES, MD5, EXPORT, CBC без AEAD).
- Соответствовать стандартам (PCI DSS, ГОСТ Р 57580, NIST SP 800-52, BSI TR-02102).
- Избежать падений соединений при обновлении серверов/клиентов.
2. Подготовка к проверке
| Шаг | Описание |
|---|---|
| 1 | Убедитесь, что у вас есть доступ к целевому хосту:порт (например, api.example.com:443). |
| 2 | Обновите инструменты: openssl >= 1.1.1, nmap >= 7.90, testssl.sh >= 3.2. |
| 3 | Определите контекст: веб-сервер, почта (SMTP/IMAP), БД, API, IoT-устройство или кастомный клиент. |
| 4 | Зафиксируйте требования: минимальная версия TLS, обязательный Forward Secrecy, поддержка клиентов. |
3. Инструменты проверки
| Инструмент | Назначение | Плюсы | Минусы |
|---|---|---|---|
openssl s_client |
Проверка конкретного suite или версии TLS | Встроен в большинство ОС, гибкий | Ручной, не сканирует автоматически |
nmap --script ssl-enum-ciphers |
Автоматическое перечисление всех поддерживаемых наборов | Быстро, наглядно, работает с SNI | Может пропускать редкие конфигурации |
testssl.sh |
Полный аудит безопасности + рекомендации | Детальный отчёт, проверки уязвимостей, совместимость с TLS 1.3 | Требует установки, занимает больше времени |
| SSL Labs (онлайн) | Публичный аудит веб-серверов | Удобный UI, оценка A-F, отчёт для менеджеров | Не работает для внутренних/IP-адресов, ограничено 443 |
| Языковые библиотеки (Python/Go/Java) | Программная проверка в CI/CD или приложениях | Автоматизация, интеграция в пайплайны | Требует написания кода |
4. Пошаговые методы проверки
Метод 1: Проверка конкретного Cipher Suite через OpenSSL
# Для TLS 1.2 и ниже
openssl s_client -connect example.com:443 -cipher 'ECDHE-RSA-AES256-GCM-SHA384'
# Для TLS 1.3 (указываются только AEAD-наборы)
openssl s_client -connect example.com:443 -ciphersuites 'TLS_AES_256_GCM_SHA384'
Успех: в выводе будет строка Cipher is ECDHE-RSA-AES256-GCM-SHA384 и SSL handshake has read ...
Ошибка: handshake failure, no ciphers available, unsupported protocol
Важно:
-cipherвлияет только на TLS <=1.2. Для TLS 1.3 используйте-ciphersuites.
Метод 2: Сканирование всех поддерживаемых наборов (Nmap)
nmap --script ssl-enum-ciphers -p 443 example.com
Вывод покажет:
- Группировку по протоколам (TLSv1.2, TLSv1.3)
- Поддержку FS (Forward Secrecy)
- Статус:
strong,acceptable,weak,insecure - Порядок предпочтения сервера
Метод 3: Полный аудит через testssl.sh
git clone https://github.com/drwetter/testssl.sh.git
cd testssl.sh
./testssl.sh example.com:443
Генерирует отчёт с:
- Поддержкой legacy-протоколов (SSLv3, TLS 1.0/1.1)
- Состоянием OCSP, HSTS, certificate chain
- Рекомендациями по отключению unsafe suites
- Экспортом в JSON/CSV для интеграции
Метод 4: Проверка совместимости клиент-сервер (симуляция)
Если нужно убедиться, что конкретный клиент (например, legacy-устройство) сможет подключиться:
# Эмуляция клиента с ограниченным набором
openssl s_client -connect server.com:443 \
-cipher 'AES128-SHA:AES256-SHA' \
-no_tls1_3 -no_tls1_2
Аналогично можно протестировать с curl:
curl -v --tlsv1.2 --ciphers 'ECDHE-RSA-AES128-GCM-SHA256' https://example.com
5. Как читать результаты
| Элемент вывода | Что означает | На что обратить внимание |
|---|---|---|
Protocol : TLSv1.3 |
Установленная версия | TLS 1.0/1.1 → отключить немедленно |
Cipher : ECDHE-RSA-AES256-GCM-SHA384 |
Выбранный набор | Наличие ECDHE или DHE → Forward Secrecy |
Server Temp Key: ECDH P-256 |
Параметры обмена ключами | Кривые < P-256 или RSA-KEX → устаревшие |
SSL-Session: Protocol : TLSv1.2 |
Фактическая сессия | Session resumption не отменяет проверку cipher'ов |
New, TLSv1.2, Cipher is ... |
Успешный handshake | Отсутствие ошибок аутентификации сертификата |
Примечание:
Названия в OpenSSL отличаются от IANA. Соответствие: ECDHE-RSA-AES256-GCM-SHA384 ↔ TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384.
6. Рекомендации по безопасной конфигурации (2024–2026)
Разрешённые наборы (приоритет)
TLS 1.3:
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
TLS 1.2 (с FS и AEAD):
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-CHACHA20-POLY1305
ECDHE-RSA-CHACHA20-POLY1305
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-GCM-SHA256
Запретить немедленно
RC4,DES,3DES,IDEAMD5,SHA1(в MAC)NULL,EXPORT,eNULL,aNULLCBCбез явной необходимости (уязвимы к padding oracle)RSAкак Key Exchange (нет Forward Secrecy)
Как применить
Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:secp256r1:secp384r1;
Apache:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder on
Генератор конфигураций: ssl-config.mozilla.org
7. Диагностика типовых проблем
| Симптом | Причина | Решение |
|---|---|---|
SSL_ERROR_NO_CYPHER_OVERLAP |
Клиент и сервер не имеют общих наборов | Синхронизировать конфигурации, включить ECDHE+AES-GCM |
handshake failure после обновления сервера |
Отключён legacy-клиентский набор | Включить fallback-профиль только если критично, иначе обновить клиент |
unsupported protocol |
TLS 1.3 включён, но клиент не поддерживает | Проверить -no_tls1_3 в тестах, обновить клиентскую библиотеку |
certificate verify failed |
Проблема не в cipher, а в сертификате/цепочке | Отдельно проверить openssl verify, SAN, даты, доверенный CA |
| Низкая производительность | Используется CHACHA20 на CPU без AES-NI |
Переключить приоритет на AES-GCM при наличии аппаратного ускорения |
Логи серверов:
- Nginx:
error.log(уровеньinfoилиdebug) - Apache:
ssl_error_log - Java:
-Djavax.net.debug=ssl:handshake
8. Автоматизация и мониторинг
Python-скрипт для быстрой проверки
import ssl, socket
def check_cipher(host, port, cipher_list):
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
for cipher in cipher_list:
ctx.set_ciphers(cipher)
try:
with socket.create_connection((host, port), timeout=5) as sock:
with ctx.wrap_socket(sock, server_hostname=host) as ssock:
print(f"OK {cipher} -> {ssock.cipher()}")
except ssl.SSLError:
print(f"FAIL {cipher} -> handshake failure")
check_cipher("example.com", 443, [
"ECDHE-RSA-AES256-GCM-SHA384",
"AES128-SHA",
"RC4-SHA"
])
CI/CD интеграция
- Запускать
testssl.sh --jsonfileв пайплайне - Парсить вывод и блокировать деплой при наличии
insecureилиweak - Мониторить изменения через
nmap --script ssl-enum-ciphersраз в неделю
Чек-лист перед релизом
- [ ] TLS 1.0/1.1 отключены на сервере
- [ ] Поддержка только
TLS 1.2+иTLS 1.3 - [ ] Все cipher'ы используют Forward Secrecy (
ECDHE/DHE) - [ ] AEAD-шифры (
AES-GCM,CHACHA20-POLY1305) в приоритете - [ ] CBC и legacy-алгоритмы запрещены
- [ ] Проверено через
testssl.shиnmap - [ ] Протестировано с ключевыми клиентами (браузеры, мобильные, legacy-API)
- [ ] Конфигурация зафиксирована в IaC/репозитории