Перейти к содержимому

HTTPS / TLS

HTTPS = HTTP + TLS — защищённая версия HTTP. TLS обеспечивает три свойства: конфиденциальность (шифрование), целостность (данные не изменены в пути), аутентификацию сервера (сертификат). TLS Handshake: Client Hello → Server Hello + сертификат → проверка сертификата → обмен ключами → защищённое соединение. Версии: TLS 1.2 и 1.3 (1.3 быстрее, 1-RTT вместо 2-RTT). Сертификаты выпускаются центрами сертификации (CA), Let's Encrypt — бесплатно, с автоматическим обновлением каждые 90 дней. HSTS (Strict-Transport-Security) — заголовок, заставляющий браузер всегда использовать HTTPS. mTLS (Mutual TLS) — взаимная аутентификация (клиент тоже предъявляет сертификат). Без HTTPS данные передаются открытым текстом (пароли, токены, личные данные). Типичные ошибки: HTTP для API, истёкший сертификат, неправильное имя в сертификате, слабые шифры.

Введение: Безопасная доставка

Представьте, что вы отправляете письмо по почте. Вы кладёте его в конверт, заклеиваете, пишете адрес. Но почтальон может открыть конверт и прочитать письмо. Может изменить текст. Может отправить письмо не тому адресату.

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

HTTPS (Hypertext Transfer Protocol Secure) — это защищённая версия HTTP. Она шифрует все данные между браузером и сервером, проверяет, что сервер — это тот, за кого себя выдаёт, и гарантирует, что данные не были изменены в пути.

В основе HTTPS лежит TLS (Transport Layer Security) — протокол шифрования, который обеспечивает три вещи:

СвойствоЧто значитАналогия
КонфиденциальностьНикто не может прочитать данныеПисьмо в запечатанном конверте
ЦелостностьДанные не были измененыПломба на конверте
АутентификацияСервер — тот, за кого себя выдаётПаспорт курьера

Без HTTPS ваш API — открытая книга. Пароли, токены, личные данные — всё передаётся открытым текстом. Использовать Basic Auth без HTTPS? Пароль передаётся в Base64 — любой может его декодировать. Использовать JWT без HTTPS? Токен могут украсть и использовать.

HTTP vs HTTPS

АспектHTTPHTTPS
Порт80443
ШифрованиеНетДа (TLS/SSL)
Аутентификация сервераНетДа (сертификат)
Целостность данныхНетДа
СкоростьБыстрееМедленнее (handshake)
SEOПлохоХорошо (Google ранжирует выше)
Современные APIНе рекомендуетсяОбязательно

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

TLS Handshake (рукопожатие)

    sequenceDiagram
    participant Client as Клиент
    participant Server as Сервер
    
    Client->>Server: 1. Client Hello (поддерживаемые шифры)
    Server-->>Client: 2. Server Hello (выбранный шифр) + Сертификат
    Client->>Client: 3. Проверка сертификата
    Client->>Server: 4. Pre-master secret (зашифрованный публичным ключом)
    Client->>Server: 5. Change Cipher Spec (переходим на шифрование)
    Server-->>Client: 6. Change Cipher Spec (подтверждение)
    Note over Client,Server: 7. Защищённое соединение установлено
  

Шаги handshake (упрощённо)

  1. Client Hello: Клиент говорит: “Я поддерживаю шифры: AES-256, ChaCha20, …”
  2. Server Hello + Сертификат: Сервер выбирает шифр и отправляет свой сертификат.
  3. Проверка сертификата: Клиент проверяет, что сертификат подписан доверенным центром.
  4. Обмен ключами: Клиент генерирует секрет, шифрует его публичным ключом сервера.
  5. Защищённое соединение: Обе стороны переходят на шифрование.

Что такое TLS 1.2, 1.3

ВерсияГодОсобенностиБезопасность
SSL 2.0, 3.01995Устаревшие, небезопасные❌ Не использовать
TLS 1.01999Устаревший❌ Не использовать
TLS 1.12006Устаревший❌ Не использовать
TLS 1.22008Современный, широко используется
TLS 1.32018Самый быстрый и безопасный✅✅

TLS 1.3 преимущества:

  • 1-RTT вместо 2-RTT (быстрее)
  • Удалены старые небезопасные шифры
  • Обязательное шифрование сертификата

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

Что такое сертификат

Сертификат — это цифровой документ, который удостоверяет, что сервер — это тот, за кого себя выдаёт.

Содержимое сертификата:

ПолеПример
Common Name (CN)api.example.com
Subject Alternative Name (SAN)api.example.com, example.com, *.example.com
Issuer (кто выпустил)Let's Encrypt, DigiCert, AWS
Valid From2024-01-01
Valid To2025-01-01
Public Key-----BEGIN PUBLIC KEY-----...
SignatureПодпись центра сертификации

Цепочка доверия (Chain of Trust)

    graph TD
    A[Корневой сертификат<br>Встроен в браузер] --> B[Промежуточный сертификат<br>Выпущен корневым]
    B --> C[Сертификат сервера<br>Выпущен промежуточным]
  
  • Корневой сертификат (Root CA): Встроен в браузеры и ОС. Абсолютное доверие.
  • Промежуточный сертификат (Intermediate CA): Выпущен корневым. Для подписи серверных сертификатов.
  • Сертификат сервера (Leaf Certificate): Выпущен промежуточным. Принадлежит вашему серверу.

Типы сертификатов

ТипОписаниеКому подходит
Domain Validation (DV)Только подтверждение владения доменомЛичные сайты, блоги
Organization Validation (OV)+ проверка организацииБизнес-сайты
Extended Validation (EV)+ юридическая проверкаБанки, e-commerce
Wildcard*.example.com — все субдоменыAPI с субдоменами
Multi-domain (SAN)Несколько доменов в одном сертификатеНесколько сервисов

Где взять сертификат

ПровайдерСтоимостьОсобенность
Let’s EncryptБесплатноАвтоматическое обновление каждые 90 дней
AWS Certificate ManagerБесплатноТолько для AWS сервисов
CloudflareБесплатноДля доменов через Cloudflare
DigiCert$200-1000/годEnterprise, EV сертификаты
Sectigo (Comodo)$50-300/годПопулярный

HSTS (HTTP Strict Transport Security)

HSTS — заголовок, который говорит браузеру: “Всегда используй HTTPS для этого сайта, даже если пользователь ввёл HTTP”.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
ДирективаЗначение
max-age=31536000Действует 1 год (в секундах)
includeSubDomainsПрименяется ко всем субдоменам
preloadДобавить в список предзагрузки браузеров

Что даёт HSTS:

  • Защита от downgrade атак (когда злоумышленник заставляет использовать HTTP)
  • Браузер никогда не отправит HTTP запрос

Риск: Если HTTPS сломается, пользователи не смогут зайти даже через HTTP.

TLS в API Gateway и Load Balancer

В современных архитектурах TLS часто заканчивается на балансировщике, а внутри сети используется HTTP.

    graph LR
    A[Клиент] -->|HTTPS| B[Load Balancer]
    B -->|HTTP| C[Сервер 1]
    B -->|HTTP| D[Сервер 2]
  

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

  • Управление сертификатами в одном месте
  • Меньше нагрузки на серверы (TLS handshake тяжёлый)
  • Гибкость (можно менять серверы, не меняя сертификаты)

Пример AWS ALB:

# AWS Application Load Balancer
Listeners:
  - Protocol: HTTPS
    Port: 443
    Certificate: arn:aws:acm:us-east-1:123:certificate/abc123
    DefaultAction:
      Type: forward
      TargetGroupName: my-api

TargetGroup:
  - Protocol: HTTP
    Port: 8080
    HealthCheckPath: /health

TLS для мобильных приложений

Особенности

  • Мобильные приложения не показывают ошибки сертификатов (в отличие от браузеров)
  • Нужна дополнительная проверка (Certificate Pinning)

Certificate Pinning

Приложение запоминает сертификат (или публичный ключ) сервера и проверяет его при каждом соединении.

Пример (Android, OkHttp):

val pinner = CertificatePinner.Builder()
    .add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
    .build()

val client = OkHttpClient.Builder()
    .certificatePinner(pinner)
    .build()

Когда использовать: Банковские приложения, приложения с высокими требованиями безопасности.

mTLS (Mutual TLS)

В обычном TLS клиент проверяет сервер. В mTLS сервер тоже проверяет клиента.

    sequenceDiagram
    participant Client as Клиент
    participant Server as Сервер
    
    Client->>Server: Привет, вот мой сертификат
    Server-->>Client: Привет, вот мой сертификат
    Client->>Client: Проверка сертификата сервера
    Server->>Server: Проверка сертификата клиента
    Note over Client,Server: Взаимная аутентификация
  

Когда использовать:

  • B2B интеграции (высокая безопасность)
  • Микросервисы внутри кластера (например, Istio)
  • Банковские API

Общие ошибки при настройке HTTPS

Ошибка 1: Использование HTTP для API

fetch('http://api.example.com/users')

Исправление: Всегда HTTPS.

Ошибка 2: Неправильное имя в сертификате

Сертификат для example.com, а API на api.example.com.

Исправление: Wildcard сертификат (*.example.com) или SAN.

Ошибка 3: Истёкший сертификат

Сертификат действителен год, потом истекает.

Исправление: Автоматическое обновление (Let’s Encrypt), мониторинг срока действия.

Ошибка 4: Mixed content

HTML через HTTPS, а картинки, скрипты, стили через HTTP.

Исправление: Все ресурсы через HTTPS.

Ошибка 5: Слабые шифры

# Плохо (TLS 1.0, слабые шифры)
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers '3DES:RC4:MD5';

# Хорошо
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';

Проверка безопасности HTTPS

Онлайн инструменты

ИнструментЧто проверяет
SSL Labs (ssllabs.com)Рейтинг A+
securityheaders.comHSTS, CSP, другие заголовки
crt.shИстория сертификатов

Командная строка

# Проверка сертификата
openssl s_client -connect api.example.com:443 -servername api.example.com

# Проверка срока действия
echo | openssl s_client -connect api.example.com:443 2>/dev/null | openssl x509 -noout -dates

# Тест HSTS
curl -I https://api.example.com | grep -i "strict-transport-security"

Будущее: TLS 1.3 и QUIC

TLS 1.3

ОсобенностьTLS 1.2TLS 1.3
Время handshake2-RTT1-RTT (или 0-RTT)
Устаревшие шифрыЕстьУдалены
Шифрование сертификатаНетДа

QUIC / HTTP/3

  • Использует UDP вместо TCP
  • Встроенное шифрование (TLS 1.3)
  • Быстрее установка соединения (0-RTT)

Резюме для системного аналитика

  1. HTTPS = HTTP + TLS. Шифрует данные между клиентом и сервером. Обеспечивает конфиденциальность, целостность, аутентификацию.

  2. TLS (Transport Layer Security) — протокол шифрования. Текущие версии: TLS 1.2 и 1.3. TLS 1.3 быстрее и безопаснее.

  3. TLS сертификат — удостоверяет личность сервера. Выпускается центрами сертификации (CA). Let’s Encrypt — бесплатно.

  4. Как работает: Handshake → проверка сертификата → обмен ключами → шифрованное соединение.

  5. HSTS (Strict-Transport-Security) — заголовок, заставляющий браузер всегда использовать HTTPS. Защита от downgrade атак.

  6. mTLS (Mutual TLS) — взаимная аутентификация. Сервер проверяет клиента. Для B2B, микросервисов.

  7. Всегда используйте HTTPS в продакшене. Даже для внутренних API (защита от перехвата в локальной сети). Даже для разработки, если приложение будет подключаться к продакшену.

Проверка знаний

Вопрос 1 из 4
Что обеспечивает TLS в основе HTTPS?
Какой порт обычно использует HTTPS?
Что происходит во время TLS handshake?
Какие версии TLS считаются современными и допустимыми в теме?

Вопросы, где были ошибки