← Cloudflare One / cloudflare-one / team-and-resources / devices / user-side-certificates
Разверните пользовательский сертификат
Клиенты с планом Enterprise, которые не хотят устанавливать сертификат Cloudflare могут загрузить в Cloudflare собственный корневой сертификат. Эту функцию иногда называют Bring Your Own Public Key Infrastructure (BYOPKI). Gateway будет использовать загруженный вами сертификат для шифрования всех сессий между конечным пользователем и Gateway, что включает все функции проверки HTTPS-трафика, ранее требовавшие сертификата Cloudflare. Вы можете загрузить в свой аккаунт несколько сертификатов, но в любой момент времени активным может быть только один. Вам также нужно загрузить закрытый ключ, чтобы перехватывать домены с помощью JIT-сертификатов и включить страница блокировки.
Можно загрузить либо корневой сертификат, либо полную цепочку сертификатов (корневой сертификат плюс промежуточные сертификаты). Загрузка цепочки сертификатов позволяет устройствам конечных пользователей устанавливать только корневой сертификат, что упрощает управление сертификатами в крупных организациях.
Можно загрузить до пяти пользовательских корневых сертификатов. Если вашей организации нужно больше пяти сертификатов, обратитесь в команду по работе с аккаунтом.
Создайте собственный корневой CA
-
Откройте терминал.
-
(Необязательно) Создайте каталог для корневого CA и перейдите в него.
mkdir -p /root/customca cd /root/customcaФайлы сертификатов можно сгенерировать в любом каталоге. Этот шаг нужен только для порядка: если пропустить его, файлы будут созданы в текущем рабочем каталоге.
-
Создайте закрытый ключ для корневого CA.
openssl genrsa -out <CUSTOM-ROOT-PRIVATE-KEY>.pem 20482048значение задаёт размер ключа RSA в битах. Вы можете использовать4096для повышения безопасности за счет немного более медленного установления соединения TLS. -
Создайте самоподписанный корневой сертификат.
openssl req -x509 -sha256 -new -nodes \ -key <CUSTOM-ROOT-PRIVATE-KEY>.pem \ -days 365 \ -out <CUSTOM-ROOT-CERT>.pem \ -addext "basicConstraints=critical,CA:TRUE" \ -addext "keyUsage=critical,keyCertSign,cRLSign"-addextфлаги добавляютbasicConstraintsиkeyUsageрасширения, требуемые RFC 5280 ↗ для сертификатов CA. Без них некоторые TLS-клиенты могут отклонять сертификаты, подписанные вашим собственным CA. В частности, Python 3.13 и более поздние версии по умолчанию строго соблюдают RFC 5280 (ssl.VERIFY_X509_STRICT), из-за чего запросы HTTPS завершаются ошибкой на устройствах, использующих Cloudflare One Client, если загруженный CA-сертификат не содержит эти расширения.-days 365значение определяет срок действия сертификата. Более короткий срок снижает риск в случае компрометации ключа, но требует более частой ротации. Ротация уже развёрнутого сертификата BYOPKI нарушает работу, поэтому выбирайте срок действия, который уравновешивает безопасность и эксплуатационные издержки.Ошибка:
Unknown cipher or option -addextЕсли в вашей системе используются версии OpenSSL старше 1.1.1,
-addextфлаг недоступен. Вместо этого используйте конфигурационный файл:openssl req -x509 -sha256 -new -nodes \ -key <CUSTOM-ROOT-PRIVATE-KEY>.pem \ -days 365 \ -out <CUSTOM-ROOT-CERT>.pem \ -config <(printf '[req]\ndistinguished_name=dn\n[dn]\n[v3_ca]\nbasicConstraints=critical,CA:TRUE\nkeyUsage=critical,keyCertSign,cRLSign') \ -extensions v3_ca -
Убедитесь, что присутствуют необходимые расширения RFC 5280:
openssl x509 -in <CUSTOM-ROOT-CERT>.pem -noout -ext keyUsage,basicConstraintsВывод должен включать:
X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Certificate Sign, CRL SignЕсли эти поля отсутствуют, повторно создайте сертификат с помощью команды из шага 4.
-
Чтобы просмотреть закрытый ключ, выполните следующую команду:
openssl rsa -in <CUSTOM-ROOT-PRIVATE-KEY>.pem -textЧтобы просмотреть сертификат, выполните следующую команду:
openssl x509 -in <CUSTOM-ROOT-CERT>.pem -text
Готовя сертификат и закрытый ключ к загрузке, обязательно удалите лишние символы, например несовпадающие поддомены в common name сертификата.
Разверните пользовательский корневой сертификат
Можно загрузить как отдельный корневой сертификат, так и полную цепочку сертификатов. При загрузке цепочки через панель управления, API или Terraform объедините корневой сертификат и все промежуточные сертификаты в формате PEM, разместив корневой сертификат первым.
-
В Панель управления Cloudflare ↗, перейдите в Zero Trust > Политики трафика > Настройки трафика > Сертификаты.
-
Выберите Загрузить сертификат.
-
Введите закрытый ключ и SSL-сертификат, которые вы сгенерировали, или выберите Вставить сертификат из файла чтобы загрузить их из файла. Если вы загружаете цепочку сертификатов, вставьте все сертификаты (корневой и промежуточные) в формате PEM, при этом корневой сертификат должен идти первым.
-
Выберите Загрузите пользовательский сертификат.
Теперь вы можете использовать сгенерированный пользовательский корневой сертификат для проверки.
-
Используйте Эндпоинт для загрузки сертификата mTLS чтобы загрузить сертификат и закрытый ключ в Cloudflare. Сертификат должен быть корневым сертификатом ЦС (root CA) или цепочкой сертификатов, оформленной в виде единой строки с
\nзаменив переносы строк.
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
Account: SSL and Certificates Write
Загрузите сертификат mTLScurl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/mtls_certificates" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "name": "example_ca_cert", "certificates": "-----BEGIN CERTIFICATE-----\nXXXXX\n-----END CERTIFICATE-----", "private_key": "-----BEGIN PRIVATE KEY-----\nXXXXX\n-----END PRIVATE KEY-----", "ca": true }'Ответ вернёт UUID сертификата. Например:
{ "success": true, "errors": [], "messages": [], "result": { "id": "2458ce5a-0c35-4c7f-82c7-8e9487d3ff60", "name": "example_ca_cert", "issuer": "O=Example Inc.,L=California,ST=San Francisco,C=US", "signature": "SHA256WithRSA", ... } }При загрузке цепочки сертификатов
certificatesполе должно содержать все сертификаты в формате PEM. Чтобы отформатировать это поле, укажите сначала корневой сертификат, а затем добавьте все промежуточные сертификаты. -
Сделайте сертификат доступным для использования при проверке с Активируйте конечную точку сертификата Zero Trust. Это развернет сертификат по всей глобальной сети Cloudflare.
Активируйте сертификат Zero Trustcurl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/certificates/$CERTIFICATE_ID/activate" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"Ответ вернёт сертификат и
pending_deploymentстатус привязки. Например:{ "errors": [], "messages": [], "success": true, "result": { "in_use": false, "id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415", "certificate": "-----BEGIN CERTIFICATE-----\\n ... \\n-----END CERTIFICATE-----\\n", "issuer_org": "Example Inc.", "issuer_raw": "O=Example Inc.,L=California,ST=San Francisco,C=US", "fingerprint": "E9:19:49:AA:DD:D8:1E:C1:20:2A:D8:22:BF:A5:F8:FC:1A:F7:10:9F:C7:5B:69:AB:0:31:91:8B:61:B4:BF:1C", "binding_status": "pending_deployment", "type": "custom", "updated_at": "2014-01-01T05:20:00.12345Z", "uploaded_on": "2014-01-01T05:20:00.12345Z", "created_at": "2014-01-01T05:20:00.12345Z", "expires_on": "2014-01-01T05:20:00.12345Z" } } -
Используйте Конечная точка для получения сведений о сертификате Zero Trust чтобы проверить, что статус привязки сертификата установлен в значение
available.Получение сведений о сертификате Zero Trustcurl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/certificates/$CERTIFICATE_ID" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{ "errors": [], "messages": [], "success": true, "result": { "in_use": false, "id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415", "certificate": "-----BEGIN CERTIFICATE-----\\n ... \\n-----END CERTIFICATE-----\\n", "issuer_org": "Example Inc.", "issuer_raw": "O=Example Inc.,L=California,ST=San Francisco,C=US", "fingerprint": "E9:19:49:AA:DD:D8:1E:C1:20:2A:D8:22:BF:A5:F8:FC:1A:F7:10:9F:C7:5B:69:AB:0:31:91:8B:61:B4:BF:1C", "binding_status": "available", "type": "custom", "updated_at": "2014-01-01T05:20:00.12345Z", "uploaded_on": "2014-01-01T05:20:00.12345Z", "created_at": "2014-01-01T05:20:00.12345Z", "expires_on": "2014-01-01T05:20:00.12345Z" } } -
(Необязательно) Убедитесь, что сертификат установлен на устройствах пользователя либо с Cloudflare One Client или вручную.
-
Используйте Patch: эндпойнт настройки конфигурации аккаунта Zero Trust чтобы включить сертификат для использования при проверке. Например:
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/configuration" \
--request PATCH \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"settings": {
"certificate": {
"id": "{certificate_id}",
"in_use": true
}
}
}'Как только in-use имеет значение true, Gateway будет подписывать ваш трафик с помощью пользовательского корневого сертификата и закрытого ключа. Если вы отключите или деактивируете пользовательский сертификат, Gateway вернется к следующему доступному сертификату Cloudflare, созданному для вашего аккаунта Zero Trust.
Используйте пользовательский корневой сертификат
Чтобы использовать пользовательский корневой сертификат, созданный и загруженный вами в Cloudflare, см. Активируйте корневой сертификат.
Устранение неполадок
Error 526: Invalid SSL certificate
Если Gateway возвращает Код ответа HTTP: 526 после развёртывания пользовательского сертификата см. Документация по ошибке Error 526.
Ошибки SSL в Python 3.13+ с Cloudflare One Client
Python 3.13 и более поздние версии включают ssl.VERIFY_X509_STRICT по умолчанию, что требует соответствия сертификатов CA требованиям RFC 5280 ↗. Если ваш сертификат BYOPKI был сгенерирован без keyUsage и basicConstraints расширений HTTPS-запросы в Python будут завершаться ошибкой, пока активен Cloudflare One Client. Чтобы решить эту проблему, создать новый пользовательский корневой CA и загрузите его в Cloudflare.