INTEGRITY Документация

Разверните пользовательский сертификат

Клиенты с планом Enterprise, которые не хотят устанавливать сертификат Cloudflare могут загрузить в Cloudflare собственный корневой сертификат. Эту функцию иногда называют Bring Your Own Public Key Infrastructure (BYOPKI). Gateway будет использовать загруженный вами сертификат для шифрования всех сессий между конечным пользователем и Gateway, что включает все функции проверки HTTPS-трафика, ранее требовавшие сертификата Cloudflare. Вы можете загрузить в свой аккаунт несколько сертификатов, но в любой момент времени активным может быть только один. Вам также нужно загрузить закрытый ключ, чтобы перехватывать домены с помощью JIT-сертификатов и включить страница блокировки.

Можно загрузить либо корневой сертификат, либо полную цепочку сертификатов (корневой сертификат плюс промежуточные сертификаты). Загрузка цепочки сертификатов позволяет устройствам конечных пользователей устанавливать только корневой сертификат, что упрощает управление сертификатами в крупных организациях.

Можно загрузить до пяти пользовательских корневых сертификатов. Если вашей организации нужно больше пяти сертификатов, обратитесь в команду по работе с аккаунтом.

Создайте собственный корневой CA

  1. Откройте терминал.

  2. (Необязательно) Создайте каталог для корневого CA и перейдите в него.

    mkdir -p /root/customca
    cd /root/customca

    Файлы сертификатов можно сгенерировать в любом каталоге. Этот шаг нужен только для порядка: если пропустить его, файлы будут созданы в текущем рабочем каталоге.

  3. Создайте закрытый ключ для корневого CA.

    openssl genrsa -out <CUSTOM-ROOT-PRIVATE-KEY>.pem 2048

    2048 значение задаёт размер ключа RSA в битах. Вы можете использовать 4096 для повышения безопасности за счет немного более медленного установления соединения TLS.

  4. Создайте самоподписанный корневой сертификат.

    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
  5. Убедитесь, что присутствуют необходимые расширения 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.

  6. Чтобы просмотреть закрытый ключ, выполните следующую команду:

    openssl rsa -in <CUSTOM-ROOT-PRIVATE-KEY>.pem -text

    Чтобы просмотреть сертификат, выполните следующую команду:

    openssl x509 -in <CUSTOM-ROOT-CERT>.pem -text

Готовя сертификат и закрытый ключ к загрузке, обязательно удалите лишние символы, например несовпадающие поддомены в common name сертификата.

Разверните пользовательский корневой сертификат

Можно загрузить как отдельный корневой сертификат, так и полную цепочку сертификатов. При загрузке цепочки через панель управления, API или Terraform объедините корневой сертификат и все промежуточные сертификаты в формате PEM, разместив корневой сертификат первым.

  1. В Панель управления Cloudflare, перейдите в Zero Trust > Политики трафика > Настройки трафика > Сертификаты.

  2. Выберите Загрузить сертификат.

  3. Введите закрытый ключ и SSL-сертификат, которые вы сгенерировали, или выберите Вставить сертификат из файла чтобы загрузить их из файла. Если вы загружаете цепочку сертификатов, вставьте все сертификаты (корневой и промежуточные) в формате PEM, при этом корневой сертификат должен идти первым.

  4. Выберите Загрузите пользовательский сертификат.

    Теперь вы можете использовать сгенерированный пользовательский корневой сертификат для проверки.

  1. Используйте Эндпоинт для загрузки сертификата mTLS чтобы загрузить сертификат и закрытый ключ в Cloudflare. Сертификат должен быть корневым сертификатом ЦС (root CA) или цепочкой сертификатов, оформленной в виде единой строки с \n заменив переносы строк.

    Необходимые разрешения API-токена

    Хотя бы одно из следующих права доступа токена требуется:
    • Account: SSL and Certificates Write
    Загрузите сертификат mTLS
    curl "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. Чтобы отформатировать это поле, укажите сначала корневой сертификат, а затем добавьте все промежуточные сертификаты.

  2. Сделайте сертификат доступным для использования при проверке с Активируйте конечную точку сертификата Zero Trust. Это развернет сертификат по всей глобальной сети Cloudflare.

    Активируйте сертификат Zero Trust
    curl "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"
    	}
    }
  3. Используйте Конечная точка для получения сведений о сертификате Zero Trust чтобы проверить, что статус привязки сертификата установлен в значение available.

    Получение сведений о сертификате Zero Trust
    curl "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"
    	}
    }
  4. (Необязательно) Убедитесь, что сертификат установлен на устройствах пользователя либо с Cloudflare One Client или вручную.

  5. Используйте Patch: эндпойнт настройки конфигурации аккаунта Zero Trust чтобы включить сертификат для использования при проверке. Например:

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.