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

Запросы на подпись сертификата (CSR)

Создайте запрос на подпись сертификата (CSR), чтобы получить пользовательский сертификат от выбранного удостоверяющего центра (CA), сохранив при этом контроль над закрытым ключом на стороне Cloudflare. Закрытый ключ, связанный с CSR, будет создан Cloudflare и никогда не покинет нашу сеть.

CSR содержит сведения о вашем домене: название и адрес организации, общее имя (доменное имя) и Subject Alternative Names (SANs).

Как только CSR будет сформирован, передайте его клиенту. Клиент отправит его в предпочитаемый им удостоверяющий центр, чтобы получить сертификат и вернуть его вам. Когда вы получите сертификат, загрузите его в Cloudflare и укажите уникальный ID CSR, который был выдан вам при создании CSR.


Сгенерируйте приватный ключ и CSR

1. Сформируйте полезную нагрузку CSR

Все поля, кроме organizational_unit и key_type, обязательны. Если вы не укажете key_type, значение по умолчанию rsa2048 (будет использован RSA 2048 бит), второй вариант: p256v1 (NIST P-256).

Значения Common Name не могут превышать 64 символа, а значения subject alternative names (SAN) не могут превышать 255 символов, согласно RFC 5280 ↗. Необходимо указать не менее одного SAN, причём список SAN должен включать common name.

request_body=$(< <(cat <<EOF
{
  "country": "US",
  "state": "MA",
  "locality": "Boston",
  "organization": "City of Boston",
  "organizational_unit": "Championship Parade Detail",
  "common_name": "app.example.com",
  "sans": [
    "app.example.com",
    "www.example.com",
    "blog.example.com",
    "example.com"
  ],
  "key_type": "p256v1"
}
EOF
))

2. Сгенерируйте CSR

Теперь вам нужно сформировать CSR, который можно будет передать клиенту.

curl https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs \
--header "X-Auth-Email: <EMAIL>" \
--header "X-Auth-Key: <API_KEY>" \
--header "Content-Type: application/json" \
--data "$request_body"

# Response:
{
  "result": {
    "id": "7b163417-1d2b-4c84-a38a-2fb7a0cd7752",
    "country": "US",
    "state": "MA",
    "locality": "Boston",
    "organization": "City of Boston",
    "organizational_unit": "Championship Parade Detail",
    "common_name": "app.example.com",
    "sans": [
      "app.example.com",
      "www.example.com",
      "blog.example.com",
      "example.com",
    ],
    "key_type": "p256v1",
    "csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIIBSzCB8gIBADBiMQswaQYDVQQGEwJVUzELMAkGA1UECBMCTUExDzANBgNVBAcT\nBkJvc3RvbjEaMBgGA1UEChMRQ2l0eSBvZiBDaGFtcGlvbnMxGTAXBgNVBAMTEGNz\nci1wcm9kLnRscy5mdW4wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAaTKf70NYlwr\n20P6P8xj8/4mTN5q28dbZR/gM3u4m/RPs24+PxAfMZCNvkVKAPVWYfUAadZI4Ha/\ndxLh5Q6X5bhIoC4wLAYJKoZIhvcNAQkOMR8wHTAbBqNVHREEFDASghBjc3ItcHJv\nZC50bHMuZnVuMAoGCCqGSM49BAMCA0gAMEUCIQDgtFUZav466SbT2FGBsIBlahDI\nVkg4y+u+V/K5DlY1+gIgQ9xLfUSKnSnJYbM9TwWr4Z964+lBtB9af4O5pp7/PSA=\n-----END CERTIFICATE REQUEST-----\n"
  },
  "success": true

Замените \n символы настоящими символами переноса строки, прежде чем передать их клиенту. Это можно сделать, направив вывод предыдущего вызова в такой инструмент, как jq или perl, например:

curl https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs \
--header "X-Auth-Email: <EMAIL>" \
--header "X-Auth-Key: <API_KEY>" \
--header "Content-Type: application/json" \
--data "$request_body" | jq .result.csr | perl -npe s'/\\n/\n/g; s/"//g' > csr.txt

3. Клиент получает сертификат

Ваш клиент возьмёт предоставленный CSR и с помощью своего CA получит подписанный, публично доверенный сертификат.

4. Загрузите сертификат

Загрузите сертификат и укажите ID, который был предоставлен при создании CSR.

Символы переноса строки в сертификате следует заменить буквальными \n символы, как показано выше в примере загрузки пользовательского сертификата. После этого сформируйте тело запроса и укажите ID, возвращённый на предыдущем шаге.

Cloudflare принимает только публично доверенные сертификаты. Если вы попытаетесь загрузить самоподписанный сертификат, он будет отклонён.

$ MYCERT="$(cat app_example_com.pem|perl -pe 's/\r?\n/\\n/'|sed -e 's/..$//')"

$ request_body=$(< <(cat <<EOF
{
  "hostname": "app.example.com",
  "ssl": {
    "custom_csr_id": "7b163417-1d2b-4c84-a38a-2fb7a0cd7752",
    "custom_certificate": "$MYCERT"
  }
}
EOF
))

Сформировав тело запроса, создайте пользовательское имя хоста с предоставленным пользовательским сертификатом. Если вы планируете использовать сертификат для нескольких имён хостов, выполните несколько вызовов API, заменяя hostname поле.


Другие действия

Получить список всех CSR

Вы можете запросить (постраничную) коллекцию всех ранее сгенерированных пользовательских CSR с помощью GET запрос к https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs.

Удаление CSR

Удалите один или несколько CSR, что также приведёт к удалению связанного закрытого ключа, выполнив DELETE запрос к https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs/{csr_id}.

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