証明書署名要求 (CSR)
Generate a Certificate Signing Request (CSR) to get a custom certificate from the Certificate Authority (CA) of your choice while maintaining control of the private key on Cloudflare. The private key associated with the CSR will be generated by Cloudflare and will never leave our network.
A CSR contains information about your domain: your organization name and address, the common name (domain name), and Subject Alternative Names (SANs).
CSRが生成されたら、それを顧客に提供します。顧客はそれを自分の選んだCAに渡して証明書を取得し、あなたに返します。証明書を受け取ったら、それをCloudflareにアップロードし、CSR作成時に提供されたユニークなCSR IDを参照する必要があります。
organizational_unitとkey_type以外のすべてのフィールドは必須です。key_typeを指定しない場合、デフォルトのrsa2048(RSA 2048ビット)が使用されます。もう一つのオプションはp256v1(NIST P-256)です。
コモンネームは64文字に制限され、代替名(SAN)は255文字に制限されています。RFC 5280 ↗に従って、少なくとも1つのSANを指定する必要があり、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"
# レスポンス:{ "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を削除するには、https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs/{csr_id}にDELETEリクエストを送信して、基になるプライベートキーを削除します。
CSRに対して生成されたプライベートキーを使用しているカスタム証明書がない場合、CSRを削除できます。プライベートキーがまだ使用中のCSRを削除しようとすると、エラーが返されます。