Как происходит шифрование и дешифровка данных между клиентом и сервером в HTTPS
Что проверяют
Понимаете ли вы, откуда в HTTPS берутся ключи и что именно защищено, и умеете ли применить это в тестировании: перехватить трафик, проверить сертификат, найти небезопасную конфигурацию. Следом часто спрашивают, почему Charles или Fiddler видят расшифрованный трафик, если соединение зашифровано.
Как отвечать
Коротко о механике TLS 1.3:
- рукопожатие: клиент и сервер обмениваются эфемерными открытыми ключами и по Диффи-Хеллману (ECDHE) вычисляют общий секрет, не передавая его по сети. Из него выводятся симметричные ключи;
- аутентификация: сервер присылает сертификат и подписывает рукопожатие закрытым ключом. Клиент проверяет цепочку до доверенного центра сертификации, срок и имя хоста;
- передача данных: запросы и ответы шифруются AEAD-шифром (AES-GCM или ChaCha20-Poly1305), он же гарантирует целостность: подменённый байт не пройдёт расшифровку;
- что видно снаружи: IP-адреса, порт и обычно имя хоста из SNI. Путь, заголовки, куки и тело зашифрованы.
Теперь про тестирование. Charles, Fiddler, Proxyman или mitmproxy встают посередине и выдают себя за сервер, подписывая сертификаты своим корневым. Поэтому корневой сертификат прокси ставят на устройство. На Android начиная с 7.0 приложения по умолчанию не доверяют пользовательским сертификатам, для отладочной сборки разработчики разрешают их в network_security_config. При certificate pinning перехват не заработает вовсе, и это нормально.
Сертификат и конфигурацию смотрят через openssl s_client -connect host:443 -servername host или SSL Labs: цепочка, срок, протоколы. Типовые кейсы: истёкший сертификат, чужое имя хоста, самоподписанный сертификат, редирект с HTTP на HTTPS, заголовок HSTS, смешанный контент, отключённые TLS 1.0 и 1.1.
Где спотыкаются
Пересказывают устаревшую схему, где клиент шифрует симметричный ключ открытым ключом сервера. В TLS 1.3 такого обмена нет.
Считают, что HTTPS скрывает всё, включая адрес сайта. Имя хоста часто видно, а IP сервера виден всегда.
Называют расшифровку трафика прокси уязвимостью HTTPS. На деле вы сами доверили устройству корневой сертификат прокси.