ECH расшифровывается как Encrypted Client Hello. Это расширение протокола в контексте Transport Layer Security (TLS). ECH шифрует часть рукопожатия и маскирует указание имени сервера (SNI), которое используется для согласования сеанса TLS.
Это означает, что при посещении пользователем сайта за Cloudflare с включенным ECH посредники смогут увидеть, что вы посещаете сайт на Cloudflare, но не смогут определить, какой именно.
Проблема
Cloudflare принудительно включить ECH (Encrypted Client Hello) для всех веб-сайтов, при этом нет возможности изменить данную настройку в интерфейсе.
Что делает ECH
ECH ограничивает доступ к информации о том, что конкретный пользователь посещает ваш сайт, гарантируя, что она не будет без необходимости передана посредникам, например поставщикам интернет-услуг (ISP). Благодаря ECH, когда пользователь заходит на ваш сайт, конкретные сведения о его посещении больше не попадают к сетевым посредникам.
Как работает ECH
При обычном рукопожатии TLS клиент отправляет серверу сообщение ClientHello, чтобы инициировать сеанс TLS. Это сообщение содержит важную информацию, включая список поддерживаемых криптографических алгоритмов, версию TLS и запрашиваемое имя сервера (доменное имя веб-сайта, к которому клиент хочет подключиться). Имя сервера указывается с помощью Server Name Indication (SNI).
В ECH часть сообщения ClientHello разделяется на два отдельных сообщения: внутреннюю и внешнюю части. Внешняя часть содержит нечувствительную информацию, такую как используемые шифры и версия TLS, а также «внешнее ClientHello». Внутренняя часть зашифрована и содержит «внутреннее ClientHello».
Внешнее ClientHello содержит общее имя (SNI), которое показывает, что пользователь пытается посетить зашифрованный веб-сайт на Cloudflare. Мы выбрали cloudflare-ech.com в качестве SNI, который будет использоваться всеми веб-сайтами на Cloudflare. Поскольку Cloudflare контролирует этот домен, у нас есть соответствующие сертификаты, чтобы согласовать рукопожатие TLS для этого имени сервера.
Внутреннее ClientHello содержит фактическое имя сервера, который пытается посетить пользователь. Оно зашифровано с помощью открытого ключа и может быть прочитано только Cloudflare. После завершения рукопожатия веб-страница загружается в обычном режиме, как и любой другой сайт, загружаемый по TLS.
На практике это означает, что любой посредник, просматривающий ваш трафик, будет видеть обычные рукопожатия TLS с одной оговоркой: любой трафик на имя сервера с поддержкой ECH на Cloudflare будет выглядеть так же. Каждое рукопожатие TLS будет выглядеть идентично, поскольку оно выглядит так, как будто пытается загрузить веб-сайт cloudflare-ech.com, а не реальный веб-сайт.
Отключение с помощью API
Перед началом работы скрипта, необходимо установить зависимости jq и curl
Создаем скрипт
1 | nano cf-update-all-zones-settings.sh |
Со следующим содержимым
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #!/bin/bash ACCOUNT_EMAIL="$1" GLOBAL_API_KEY="$2" OPTION="${3:-ech}" VALUE="${4:-off}" if [ -z "${ACCOUNT_EMAIL}" ] || [ -z "${GLOBAL_API_KEY}" ]; then echo "Usage: $0 CLOUDFLARE_ACCOUNT_EMAIL CLOUDFLARE_GLOBAL_API_KEY [OPTION] [VALUE]" echo "Set specified setting for all zones for given account" echo "By default disable TLS ECH, that can not be done from web UI for free accounts" echo "To disable TLS 1.3 use this option: tls_1_3 off" echo echo "Docs: https://developers.cloudflare.com/api/operations/zone-settings-get-all-zone-settings" echo "Get all available zone settings: GET https://api.cloudflare.com/client/v4/zones/ID_ZONE/settings" exit 1 fi type curl && type jq || exit 1 curl -s -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "X-Auth-Email: ${ACCOUNT_EMAIL}" \ -H "X-Auth-Key: ${GLOBAL_API_KEY}" \ | jq '.result' | jq '.[]' | jq -c '[.id,.name]' \ | while read -r i; do ID_ZONE=$(echo "$i" | jq -r '.[0]') NAME_ZONE=$(echo "$i" | jq -r '.[1]') echo "Zone id: ${ID_ZONE}" echo "Name: ${NAME_ZONE}" echo "Changing ${OPTION} to ${VALUE} ..." curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${ID_ZONE}/settings/${OPTION}" \ -H "X-Auth-Email: ${ACCOUNT_EMAIL}" \ -H "X-Auth-Key: ${GLOBAL_API_KEY}" \ -H "Content-Type:application/json" --data "{\"id\":\"${OPTION}\",\"value\":\"${VALUE}\"}" | jq done |
и выполняем его с указанными параметрами
1 | bash cf-update-all-zones-settings.sh [email] [api-key] |
Где
- [Email] - Email адрес аккаунта CloudFlare
- [api-key] - Глобальный API ключ (Global API Key), получить можно на странице профиля https://dash.cloudflare.com/profile/api-tokens
Скрипт автоматически получит все зоны и отключит для всех сайтов на аккаунте ECH (Encrypted Client Hello).
После окончания работы скрипта, не забудьте проверить настройки SSL/TLS - SSL/TLS encryption и SSL/TLS - Edge Certificates.