Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. SSL/TLS полная защита
ssl_tls_complete

SSL/TLS полная защита

Сертификаты, SNI, OCSP stapling, TLS 1.3, cipher suites

SSL/TLS полная защита в HAProxy

SSL termination, сертификаты, SNI, OCSP stapling, TLS 1.3, cipher suites.

#SSL Termination

#Базовая настройка SSL

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem default_backend web_servers

Требования:

  • PEM файл содержит сертификат + приватный ключ
  • Файл должен быть читаем процессом HAProxy
  • Порт 443 должен быть открыт в firewall

#Создание PEM файла

# Объединение сертификата и ключа cat site.crt site.key > /etc/haproxy/certs/site.pem # С правильными правами chmod 600 /etc/haproxy/certs/site.pem chown haproxy:haproxy /etc/haproxy/certs/site.pem

#PEM с цепочкой сертификатов

# Полный chain: сертификат + intermediate + ключ cat site.crt intermediate.crt root.crt site.key > /etc/haproxy/certs/site.pem

Порядок важен:

  1. Сертификат сервера
  2. Intermediate CA
  3. Root CA (опционально)
  4. Приватный ключ

#SNI (Server Name Indication)

#Несколько доменов на одном IP

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/ default_backend web_servers

Как работает:

  • HAProxy выбирает сертификат по имени домена (SNI)
  • В директории /etc/haproxy/certs/ файлы domain1.pem, domain2.pem
  • Клиент указывает домен в TLS handshake

#SNI с wildcard

frontend https_front # Wildcard сертификат для *.example.com bind *:443 ssl crt /etc/haproxy/certs/wildcard.pem # Отдельный сертификат для api.example.com bind *:443 ssl crt /etc/haproxy/certs/api.pem default_backend web_servers

#OCSP Stapling

#Базовая настройка

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem ocsp /etc/haproxy/ocsp/site.der default_backend web_servers

Преимущества:

  • Клиент не делает запрос к OCSP серверу (быстрее handshake)
  • Снижение нагрузки на CA OCSP серверы
  • Лучшая приватность (CA не знает какие сайты посещает клиент)

#Обновление OCSP ответа

# Скрипт обновления (cron ежедневно) #!/bin/bash CERT=/etc/haproxy/certs/site.pem OCSP=/etc/haproxy/ocsp/site.der # Извлечь URL OCSP из сертификата OCSP_URL=$(openssl x509 -in $CERT -noout -ocsp_uri) # Получить OCSP ответ openssl ocsp -issuer /etc/haproxy/certs/issuer.crt \ -cert $CERT \ -url $OCSP_URL \ -respout $OCSP # Reload HAProxy systemctl reload haproxy

#Автоматическое OCSP stapling (HAProxy 2.1+)

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem alpn h2,http/1.1 # HAProxy автоматически получает и обновляет OCSP default_backend web_servers

#TLS 1.3

#Включение TLS 1.3

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem \ ssl-min-ver TLSv1.2 \ ssl-max-ver TLSv1.3 default_backend web_servers

Параметры:

  • ssl-min-ver TLSv1.2 — запретить TLS 1.0/1.1
  • ssl-max-ver TLSv1.3 — разрешить TLS 1.3

#TLS 1.3 только

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem \ ssl-min-ver TLSv1.3 default_backend web_servers

Совместимость:

  • ✅ Современные браузеры (2020+)
  • ⚠️ Старые браузеры/клиенты не подключатся

#Cipher Suites

#Современные cipher suites (2024)

global ssl-default-bind-ciphers ECDHE+AESGCM:DHE+AESGCM:ECDHE+SHA256:DHE+SHA256 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

Параметры:

  • ssl-default-bind-ciphers — TLS 1.2 и ниже
  • ssl-default-bind-ciphersuites — TLS 1.3

#Recommended configuration

global # TLS 1.2 cipher suites ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 # TLS 1.3 cipher suites ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 # Опции ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

#Проверка cipher suites

# Проверка поддерживаемых cipher suites openssl s_client -connect example.com:443 -cipher 'ECDHE+AESGCM' # Проверка TLS 1.3 openssl s_client -connect example.com:443 -tls1_3

#SSL параметры

#No TLS tickets

global ssl-default-bind-options no-tls-tickets

Зачем:

  • TLS tickets хранятся на сервере (риск компрометации)
  • Отключение улучшает forward secrecy
  • Небольшой overhead на полный handshake каждый раз

#Prefer server ciphers

global ssl-default-bind-options prefer-server-ciphers

Поведение:

  • HAProxy выбирает cipher suite из своего списка
  • Клиент не может выбрать слабый cipher

#SSL session timeout

global tune.ssl.lifetime 3600

Параметр:

  • Время жизни SSL сессии в секундах
  • По умолчанию 300 (5 минут)

#Mutual TLS (Client Certificates)

#Требование клиентского сертификата

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/server.pem \ verify required ca-file /etc/haproxy/certs/ca.crt default_backend web_servers

Параметры:

  • verify required — требовать клиентский сертификат
  • ca-file — CA для проверки клиентских сертификатов

#Optional client certificate

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/server.pem \ verify optional ca-file /etc/haproxy/certs/ca.crt # ACL для клиентов с сертификатом acl has_client_cert ssl_fc_client_verify use_backend secure_servers if has_client_cert default_backend web_servers

#SSL к backend серверам

#SSL на backend

backend secure_servers server web1 192.168.1.10:8443 ssl verify required ca-file /etc/haproxy/certs/ca.crt server web2 192.168.1.11:8443 ssl verify required ca-file /etc/haproxy/certs/ca.crt

Параметры:

  • ssl — использовать SSL
  • verify required — проверять сертификат backend
  • ca-file — CA для проверки

#SSL с client certificate

backend secure_servers server web1 192.168.1.10:8443 ssl crt /etc/haproxy/certs/client.pem verify required ca-file /etc/haproxy/certs/ca.crt

Использование:

  • Mutual TLS с backend
  • Сертификат клиента для аутентификации на backend

#Full Example: Production SSL

global # Современные cipher suites ssl-default-bind-ciphers ECDHE+AESGCM:DHE+AESGCM:ECDHE+SHA256:DHE+SHA256 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 # Безопасные опции ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets prefer-server-ciphers # SSL session lifetime tune.ssl.lifetime 3600 tune.ssl.default-dh-param 2048 frontend https_front # SNI с несколькими сертификатами bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 # OCSP stapling (автоматическое в HAProxy 2.1+) # bind *:443 ssl crt /etc/haproxy/certs/site.pem ocsp /etc/haproxy/ocsp/site.der # HTTP/2 только (опционально) # http2 # Redirect HTTP → HTTPS http-request redirect scheme https code 301 if !{ ssl_fc } # HSTS header http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Security headers http-response set-header X-Frame-Options "SAMEORIGIN" http-response set-header X-Content-Type-Options "nosniff" http-response set-header X-XSS-Protection "1; mode=block" default_backend web_servers backend web_servers # SSL к backend (если требуется) # server web1 192.168.1.10:8443 ssl verify required ca-file /etc/haproxy/certs/ca.crt server web1 192.168.1.10:8080 check server web2 192.168.1.11:8080 check

#Troubleshooting SSL

#Проверка сертификата

# Проверка PEM файла openssl x509 -in /etc/haproxy/certs/site.pem -text -noout # Проверка цепочки openssl verify -CAfile /etc/haproxy/certs/ca.crt /etc/haproxy/certs/site.pem # Проверка OCSP openssl x509 -in /etc/haproxy/certs/site.pem -noout -ocsp_uri

#Проверка SSL подключения

# Полная информация openssl s_client -connect example.com:443 -servername example.com # Проверка TLS 1.3 openssl s_client -connect example.com:443 -tls1_3 # Проверка cipher suite openssl s_client -connect example.com:443 -cipher 'ECDHE+AESGCM'

#SSL ошибки в логах

# Certificate expired
SSL error: certificate has expired

# Chain verification failed
SSL error: unable to verify the first certificate

# Cipher mismatch
SSL error: no shared cipher

#Best Practices

#Сертификаты

# ✅ Хорошо # - Использовать Let's Encrypt или доверенный CA # - Автоматическое обновление (certbot cron) # - Chain сертификатов в PEM файле # ❌ Плохо # - Self-signed сертификаты в production # - Просроченные сертификаты # - Неполный chain

#TLS настройки

# ✅ Хорошо ssl-min-ver TLSv1.2 no-tls-tickets prefer-server-ciphers # ❌ Плохо # ssl-min-ver TLSv1.0 # Устарело # ssl-max-ver TLSv1.2 # Нет TLS 1.3

#Производительность

# ✅ Баланс безопасности и скорости tune.ssl.lifetime 3600 # Session caching tune.ssl.default-dh-param 2048 # ❌ Излишне параноидально # tune.ssl.lifetime 60 # Частые handshake # tune.ssl.default-dh-param 4096 # Медленный handshake

Далее: TCP mode и L4 балансировка