Подробный гайд: Как проверить совместимость Cipher Suites

Гайд по проверке совместимости Cipher Suites: настройка OpenSSL, Nmap и testssl.sh, диагностика ошибок и безопасные конфигурации TLS 1.2/1.3 для серверов.

2026.05.04                  


Подробный гайд: Как проверить совместимость Cipher SuitesПодробный гайд: Как проверить совместимость 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-SHA384TLS_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, IDEA
  • MD5, SHA1 (в MAC)
  • NULL, EXPORT, eNULL, aNULL
  • CBC без явной необходимости (уязвимы к 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/репозитории