Аудит конфигурации HTTPS

Вставьте заголовки ответа сайта — и, если они у вас есть, его сертификат, фрагмент исходного кода страницы и имя хоста — и эта страница сообщит, как настроена сторона HTTPS: задан ли HSTS и на какой срок, обновляет ли политика безопасности содержимого небезопасные запросы, помечены ли cookie как Secure и SameSite, не выдаёт ли баннер сервера версию и что говорят прокси-заголовки о запросе, который увидело приложение. Сертификат проверяется в том же отчёте, обычные подресурсы http:// подсчитываются по исходному коду страницы, а команды, которые видят рукопожатие, перечислены для запуска вами самими. Всё работает в браузере, и страница сама не делает никаких запросов.
1. Заголовки ответа
Весь блок заголовков ответа, включая строку состояния. Самый простой источник: curl -sI https://example.com/ в терминале или панель Headers вкладки Network в инструментах разработчика браузера, скопированная из начала файла. Лишние заголовки читаются и игнорируются; сообщаются только относящиеся к HTTPS.
2. Сертификат или цепочка (необязательно)
Если это заполнено, в том же отчёте будет полный аудит сертификата, так что конфигурация и сертификат читаются вместе. Подойдут PEM, голое тело в base64 или hex и файл PKCS#7 .p7b; проверка сертификата отдельно разбирает сертификат подробнее.
3. Фрагмент исходного кода страницы (необязательно)
Вставьте исходный код страницы (или только теги с URL), и будет выведен каждый обычный адрес http://, потому что подресурс, загруженный по HTTP, ломает значок замка и может быть подменён в пути даже тогда, когда сама страница пришла по HTTPS. Адреса на собственный хост сайта выделяются отдельно, поскольку именно их исправил бы относительный URL.
4. Имя хоста (необязательно)
Если указано имя хоста, аудит проверит альтернативные имена субъекта так, как это делает браузер, включая правила подстановочных имён, и сравнит с ним адреса http://.
ничего не проверено
Пример намеренно несовершенен, чтобы в каждой части отчёта было что-то: блок заголовков с HSTS и политикой безопасности содержимого (но без preload и с одним cookie без SameSite), цепочка из двух сертификатов и фрагмент страницы, который загружает скрипт по обычному http:// и так же ссылается на изображение на собственный хост сайта. На примере ожидайте F и читайте выводы ниже, чтобы понять, что означает каждый из них.
Что проверяется. Из блока заголовков: HSTS, его max-age, includeSubDomains и preload; политика безопасности содержимого, которая обновляет небезопасные запросы; флаги Secure, HttpOnly и SameSite у каждого Set-Cookie; баннер сервера, который называет продукт и версию; и пересылаемые заголовки, которые говорят, видело ли приложение запрос как HTTPS. Из блока сертификата: полный аудит сертификата, вплоть до того, действительно ли каждое звено цепочки подписало следующее. Из исходного кода страницы: обычные подресурсы http://. Три части сообщаются отдельно, а затем суммируются вместе, поскольку сломанный замок обычно вызван одной из этих трёх, а не двумя другими. Полный список заголовков безопасности ответа OWASP — X-Content-Type-Options, защита фреймов, Referrer-Policy, Permissions-Policy, COOP, COEP, CORP и оценка по баллам — вставьте тот же блок заголовков на страницу Проверка заголовков безопасности; эти две страницы делят работу по уровню TLS и уровню заголовков.

Чего он не видит. Эта страница никогда не открывает TLS-соединение. Браузеры не показывают странице рукопожатие, поэтому версия протокола, набор шифров, группа обмена ключами, OCSP-стейплинг, возобновление сессии, 0-RTT, цепочка сертификатов, которую реально отправляет живой сервер, и то, происходит ли перенаправление HTTP на HTTPS на источнике или на прокси, — всё это вне того, что может сообщить любая веб-страница. Она также не может обратиться к сторонним сайтам, чтобы собрать заголовки за вас, и не может сказать, доверяется ли сертификат, поскольку это зависит от хранилища корневых сертификатов, которое страница не может прочитать. Команды ниже этой страницы видят всё это, и их предназначено запускать вам самим на своей машине.

Где взять блок заголовков. В терминале curl -sI https://example.com/ выводит ровно то, что нужно этой странице. В браузере откройте инструменты разработчика, перейдите на вкладку Network, перезагрузите страницу, выберите запрос документа и скопируйте всю область Response Headers или используйте Copy → Copy response headers. Для проверки перенаправления также выполните curl -sI http://example.com/ и вставьте оба блока: страница сообщит о них один за другим.
Аудит ещё не выполнялся. Вставьте блок заголовков выше и нажмите Проверить конфигурацию для полного отчёта; сертификат, фрагмент исходного кода страницы и имя хоста необязательны, и каждый добавляет свой раздел.
Проверка доступности — единственная часть этой страницы, которая использует сеть
Страница не может открыть TLS-соединение, но может отправить обычный запрос. Если сайт разрешает межсайтовое чтение, URL, на который в итоге попадает ответ, показывает, было ли http:// перенаправлено на https://, и это всё, что может доказать проверка. Если запрос не удался, эта страница не может определить, недоступен ли хост, недоступно ли ваше собственное соединение или сайт просто не разрешает межсайтовое чтение — последнее самый частый случай, потому что большинство сайтов не отправляют Access-Control-Allow-Origin. Адрес http:// обрабатывается раньше любого перенаправления, поэтому это единственное, что здесь браузер попытается сделать по обычному соединению. Ничего не покидает браузер, пока вы не нажмёте кнопку.
Команды, которые видят рукопожатие
curl -sI https://example.com/ # the header block this page reads curl -sI http://example.com/ # is plain HTTP answered, or redirected? curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' http://example.com/ openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null openssl s_client -connect example.com:443 -servername example.com -tls1_3 </dev/null 2>/dev/null \ | openssl x509 -noout -subject -issuer -dates -ext subjectAltName nmap --script ssl-enum-ciphers -p 443 example.com testssl.sh example.com # or: docker run --rm -ti drwetter/testssl.sh example.com
Их предназначено запускать вам самим, на машине, которую вы контролируете, против хоста, который вам разрешено тестировать. Вывод -showcerts можно вставить прямо в проверку сертификата, а вывод заголовков — обратно на эту страницу.
Сертификат — публичный документ. Каждый публично доверенный сертификат публикуется в журналах Certificate Transparency, поэтому любое имя хоста внутри него — в том числе внутреннее или ошибочно написанное имя, которое подписал публичный центр сертификации, — можно найти, поискав по этим журналам. Сертификат также содержит адреса для отзыва, которые выбрал его издатель, и они иногда называют внутренний хост. Поэтому сертификат, который отдаёт CDN, ничего не говорит о сервере-источнике: имена в нём принадлежат CDN. Если аудит выявит имя хоста, которого вы не ожидали, считайте его публичным и замените то, что оно защищает.

Конфиденциальность: блок заголовков, сертификат и исходный код страницы читаются локально и никуда не загружаются, и никакой запрос не выполняется, пока вы не нажмёте кнопку в проверке доступности. Чтобы создать собственный сертификат, используйте генератор самоподписанных сертификатов; чтобы проверить, что закрытый ключ принадлежит сертификату, используйте сопоставитель сертификата и ключа.