小樱 发表于 2025/4/15 21:25

cloudflare cf cdn的证书到期不自动续签https每次都要去邮件里面批准签发的解决办法,增加acme记录值 api立即自动化验证

cloudflare cf cdn的证书到期不自动续签https每次都要去邮件里面批准签发的解决办法,增加acme记录值 api立即自动化验证

现在是剩下31天到期就触发自动续期,但是需要去邮件中批准签发,感觉CDN像是烂了一样






查了下,说设置个DCV委派就好了,就不用手动批准证书了


这个功能好像没有效果,等明天在看看
cf的帮助文档里面写了每4小时检测一次证书签发请求

帖子补充
原来要收费,怪不得不起效果,需要激活ACM(Advanced Certificate Manager)后,才能支持acme功能
https://developers.cloudflare.com/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv/

有个api强制改成http验证不知道有没有效果,用http验证颁发续签证书,而不是发电子邮件要求批准
https://developers.cloudflare.com/api/resources/ssl/subresources/verification/methods/edit/

查了下邮箱里的批准颁发邮件,在帮助文档里面没有找到相关的api立即验证,抓包下好像没法通过key调用,所以还是用文档里的吧
https://certvalidate.cloudflare.com/validations/txt/acme?domain=itzmx.com&token=xxxxx&certificate_pack_id=xxxxx


获取地址:https://dash.cloudflare.com/profile
点击Global API Key(X-Auth-Key)
然后发起
查看ssl证书包,右下角有个API区域 ID,下面的地址自己换一下,看到你自己的地址,邮箱换成你的cf登陆邮箱
但是发现这里获取uuid比较麻烦,在result字段里面的那个id才是对的,certificates字段里面的两个id不知道做什么,至少没法用来完成后续步骤
curl -X GET "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/ssl/certificate_packs" \
   -H "X-Auth-Email: user@gmail.com" \
   -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41"

所以这里推荐采用这个来获取cert_pack_uuid字段,直接干净清爽多了,方便下方后续调用
curl -X GET "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/ssl/verification" \
    -H "X-Auth-Email: user@gmail.com" \
    -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41"

编辑为http验证颁发续签证书
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/ssl/verification/$CERTIFICATE_PACK_ID" \
    -H "X-Auth-Email: user@gmail.com" \
    -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
    -H "Content-Type: application/json" \
    -d '{
      "validation_method": "http"
    }'

怎么批量编辑?保存成 cert_pack_uuid.sh,需要安装jq来解析json,cf服务器限制每分钟最多更新4个,所以sh脚本里面加了限速代码,并且引用了数组来实现循环更新
yum -y install jq
#!/bin/bash
#https://bbs.itzmx.com/thread-112420-1-1.html
#下面的地址自己换一下
ZONE_ID="023e105f4ecef8ad9ca31a8372d0c353"
AUTH_EMAIL="user@gmail.com"
AUTH_KEY="c2547eb745079dac9320b638f5e225cf483cc5cfdda41"

while true; do
    RESPONSE=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/verification" \
      -H "X-Auth-Email: $AUTH_EMAIL" \
      -H "X-Auth-Key: $AUTH_KEY")

    CERT_PACK_UUIDS=($(echo "$RESPONSE" | jq -r '.result[].cert_pack_uuid'))

    if [ -z "${CERT_PACK_UUIDS[*]}" ]; then
      echo "没有找到符合条件的证书包,结束操作。"
      break
    fi

    START_INDEX=0

    while [ $START_INDEX -lt ${#CERT_PACK_UUIDS[@]} ]; do
      cert_pack_uuid=${CERT_PACK_UUIDS[$START_INDEX]}
      
      UPDATE_RESPONSE=$(curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/verification/$cert_pack_uuid" \
            -H "X-Auth-Email: $AUTH_EMAIL" \
            -H "X-Auth-Key: $AUTH_KEY" \
            -H "Content-Type: application/json" \
            -d '{
                "validation_method": "http"
            }')

      if echo "$UPDATE_RESPONSE" | jq -e '.success' > /dev/null; then
            echo "成功更新证书包 UUID: $cert_pack_uuid"
            START_INDEX=$((START_INDEX + 1))
      else
            error_message=$(echo "$UPDATE_RESPONSE" | jq -r '.errors[] | .message')
            echo "更新证书包 UUID: $cert_pack_uuid 失败: $error_message"

            if [[ "$error_message" == *"Rate limit reached"* ]]; then
                echo "请求速率限制已达到,等待 60 秒..."
                sleep 60
                continue
            fi
      fi
    done
done

完美了,写好自动化更新cf的https证书脚本了


还有个超便捷的方法就是点击禁用ssl通道,刷新页面看到证书都删除了后,过10秒钟在启用,也可以重新签发证书无需手动批准,但是会导致网站中断访问10分钟左右

页: [1]
查看完整版本: cloudflare cf cdn的证书到期不自动续签https每次都要去邮件里面批准签发的解决办法,增加acme记录值 api立即自动化验证