証明書署名リクエスト(CSR)を生成すると、希望する認証局(CA)からカスタム証明書を取得でき、秘密鍵は Cloudflare 上で管理したままにできます。CSR に紐づく秘密鍵は Cloudflare が生成し、Cloudflare のネットワーク外には出ません。
CSR には、ドメインに関する情報として、組織名と住所、コモンネーム(ドメイン名)、Subject Alternative Names(SANs)が含まれます。
CSR を生成したら、顧客に渡します。顧客は希望する CA に提出して証明書を取得し、返します。証明書を受け取ったら Cloudflare にアップロードし、CSR 作成時に渡された一意の CSR ID を指定します。
organizational_unit と key_type 以外のフィールドは必須です。key_type を指定しない場合、デフォルトの rsa2048(RSA 2048 ビット)が使われます。もう 1 つの選択肢は p256v1(NIST P-256)です。
コモンネームは 64 文字まで、Subject Alternative Names(SAN)は 255 文字までです(RFC 5280 ↗)。SAN は少なくとも 1 つ指定し、SAN の一覧にはコモンネームを含めてください。
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
))次に、顧客に渡す 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顧客は渡された CSR を使い、CA とやり取りして署名済みの公開信頼証明書を取得します。
証明書をアップロードし、CSR 生成時に渡された ID を指定します。
上記のカスタム証明書アップロード例と同様に、証明書内の改行をリテラルの \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
))リクエスト本文ができたら、渡したカスタム証明書で カスタムホスト名を作成 します。同じ証明書を複数のホスト名で使う場合は、hostname フィールドを差し替えて API を複数回呼び出します。
これまでに生成したカスタム CSR の(ページ分割された)一覧は、https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs への GET リクエストで取得できます。
基盤の秘密鍵ごと CSR を 1 件以上削除するには、https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs/{csr_id} へ DELETE リクエストを送ります。
その CSR 用に生成された秘密鍵を使うカスタム証明書がなければ、CSR を削除できます。秘密鍵がまだ使われている CSR を削除しようとすると、エラーになります。