跳转到内容
搜索文档

证书签名请求 (CSR)

最后更新 查看 MarkdownAgent 设置

生成证书签名请求(CSR),从您选择的证书颁发机构(CA)获取 custom certificate,同时在 Cloudflare 上保留对私钥的控制。与 CSR 关联的私钥由 Cloudflare 生成,且永远不会离开我们的网络。

CSR 包含有关您域名的信息:组织名称和地址、通用名称(域名)以及主题备用名称(SAN)。

生成 CSR 后,将其提供给您的客户。然后您的客户将其传递给他们首选的 CA 以获取证书,并将其返还给您。收到证书后,您应该将其上传到 Cloudflare 并引用在创建 CSR 时提供给您的唯一 CSR ID。


生成私钥和 CSR

1. 构建 CSR 有效负载

除 organizational_unit 和 key_type 之外,所有字段都是必需的。如果您未指定 key_type,将使用默认值 rsa2048 (RSA 2048 bit);另一个选项是 p256v1 (NIST P-256)。

根据 RFC 5280,通用名称限制为 64 个字符,使用者可选名称 (SAN) 限制为 255 个字符。您必须至少指定一个 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
))

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. 上传证书

上传证书并引用在生成 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
))

构建请求正文后,使用提供的自定义证书创建自定义主机名。如果您打算对多个主机名使用该证书,请多次进行 API 调用以替换 hostname 字段。


其他操作

列出所有 CSR

您可以通过向 https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs 发出 GET 请求来请求(分页)获取所有先前生成的自定义 CSR 集合。

删除 CSR

通过向 https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_csrs/{csr_id} 发出 DELETE 请求,删除一个或多个 CSR 以删除基础私钥。

只要没有自定义证书使用为该 CSR 生成的私钥,您就可以删除该 CSR。如果尝试删除其私钥仍在使用中的 CSR,您将收到一条错误消息。

这篇文档对您有帮助吗?