← Cloudflare SSL/TLS / ssl / origin-configuration / authenticated-origin-pull
Интеграция с AWS
В этом руководстве описано, как настроить для каждого имени хоста authenticated origin pulls для безопасного подключения к AWS Application Load Balancer с использованием проверка mutual TLS ↗.
Перед началом работы
- У вас уже должна быть учётная запись AWS и EC2 ↗ настроен.
- Обратите внимание, что в этом руководстве для создания пользовательского сертификата используется интерфейс командной строки (CLI), а также Вызовы API для настройки Cloudflare Authenticated Origin Pulls.
- Актуальную документацию о настройке AWS см. в Документация AWS ↗.
1. Создание пользовательского сертификата
- Выполните следующую команду, чтобы создать закрытый ключ RSA длиной 4096 бит с шифрованием AES-256. Введите кодовую фразу, когда будет предложено.
openssl genrsa -aes256 -out rootca.key 4096- Создайте корневой сертификат CA. При появлении запроса укажите информацию, которая должна быть включена в сертификат. Для поля
Common Nameполе используйте в качестве значения имя домена, а не имя хоста.
openssl req -x509 -new -nodes -key rootca.key -sha256 -days 1826 -out rootca.crt- Создайте запрос на подпись сертификата (CSR). При появлении запроса укажите информацию, которая должна быть включена в запрос. Для поля
Common Nameполе используйте в качестве значения имя хоста.
openssl req -new -nodes -out cert.csr -newkey rsa:4096 -keyout cert.key- Подпишите сертификат с помощью
rootca.keyиrootca.crtсозданные на предыдущих шагах.
openssl x509 -req -in cert.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out cert.crt -days 730 -sha256 -extfile ./cert.v3.ext- Убедитесь, что файл расширений сертификата
cert.v3.extуказывает следующее:
basicConstraints=CA:FALSE2. Настройка AWS Application Load Balancer
- Загрузите
rootca.certк Бакет S3 ↗. - Создание хранилища доверенных сертификатов ↗ в консоли EC2, указав S3 URI куда вы загрузили сертификат.
- Создайте инстанс EC2 и установите демон HTTPD. Выберите тип инстанса ↗ в соответствии с вашими потребностями: это может быть минимальный экземпляр, имеющий право на AWS Free Tier ↗. Это руководство основано на примере с использованием t2.micro и Amazon Linux 2023 ↗.
sudo yum install -y httpd
sudo systemctl start httpd- Создайте целевая группа ↗ для вашего Application Load Balancer.
- Выберите Экземпляры в качестве целевого типа.
- Укажите порт
HTTP/80.
- После завершения настройки целевой группы убедитесь, что целевая группа является исправен ↗.
- Настройка балансировщика нагрузки и listener ↗.
- Выберите Обращённый в интернет схема.
- Переключите прослушиватель на порт
443чтобы mTLS опция доступна, и выберите целевую группу, созданную на предыдущих шагах. - Для Серверный SSL/TLS-сертификат по умолчанию, выберите Импорт сертификата > Импорт в ACM, и добавьте закрытый ключ и тело сертификата.
- В разделе Обработка клиентских сертификатов, выберите Проверить по хранилищу доверия.
- Сохраните настройки.
- (Необязательно) Выполните следующие команды, чтобы убедиться, что Application Load Balancing запрашивает клиентский сертификат.
openssl s_client -verify 5 -connect <your-application-load-balancer>:443 -quiet -stateПоскольку вы ещё не загрузили сертификат в Cloudflare, соединение должно завершиться ошибкой (read:errno=54, например).
Вы также можете выполнить curl --verbose и подтвердите Request CERT (13) присутствует в процессе SSL/TLS-рукопожатия:
curl --verbose https://<your-application-load-balancer>
...
* TLSv1.2 (IN), TLS handshake, Request CERT (13):
...3. Настройте Cloudflare
- Загрузите сертификат который вы создали в Шаг 1 в Cloudflare. Следует использовать конечный сертификат, а не корневой CA.
MYCERT="$(cat cert.crt|perl -pe 's/\r?\n/\\n/'|sed -e 's/..$//')"
MYKEY="$(cat cert.key|perl -pe 's/\r?\n/\\n/'|sed -e's/..$//')"
request_body=$(< <(cat <<EOF
{
"certificate": "$MYCERT",
"private_key": "$MYKEY",
"bundle_method":"ubiquitous"
}
EOF
))
# Push the certificate
curl --silent \
"https://api.cloudflare.com/client/v4/zones/$ZONEID/origin_tls_client_auth/hostnames/certificates" \
--header "Content-Type: application/json" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY" \
--data "$request_body"- Привяжите сертификат к имени хоста которым следует его использовать.
Необходимые разрешения API-токена
Хотя бы одно из следующих права доступа токена требуется:SSL and Certificates Write
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames" \
--request PUT \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"config": [
{
"enabled": true,
"cert_id": "<CERT_ID>",
"hostname": "<YOUR_HOSTNAME>"
}
]
}'Откат конфигурации Cloudflare
-
Используйте
PUTзапрос чтобы отключить Authenticated Origin Pulls для этого имени хоста.
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
SSL and Certificates Write
Включение или отключение имени хоста для аутентификации клиентаcurl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames" \ --request PUT \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "config": [ { "enabled": false, "cert_id": "<CERT_ID>", "hostname": "<YOUR_HOSTNAME>" } ] }' -
(Необязательно) Используйте
GETзапрос чтобы получить список идентификаторов клиентских сертификатов. ID сертификата, который нужно удалить, понадобится вам на следующем шаге.
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
SSL and Certificates WriteSSL and Certificates Read
Список сертификатовcurl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames/certificates" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" -
Используйте Удаление клиентского сертификата хоста конечную точку, чтобы удалить загруженный вами сертификат.
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
SSL and Certificates Write
Delete Hostname Client Certificatecurl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames/certificates/$CERTIFICATE_ID" \ --request DELETE \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"