如何使用cloudflare实现域名证书的多服务器分发

需求来源:

多台服务器使用同一个一级域名,虽然有一台服务器使用acme或者1panel申请了通配符证书(免费版,3个月需要续签一次),但是想要把证书分发到各个其他服务器是个麻烦事,旧方案:

  1. 手动拷贝证书文件
  2. 服务器A申请完证书后通过scp和相关命令复制证书到其他服务器,并重启其他服务器的相关依赖服务如nginx

想了想,管理起来还是麻烦,虽然有类似的管理服务(certd),但是我总觉得不对劲,有必要这么麻烦吗?

不就是一个分发的问题吗?把证书丢到一个地方,哪个服务器需要自己去拿不就行了?

解决方案:

正好我是cloudflare的忠实用户,域名绑定也是用的cloudflare的ddns方案,干脆使用cloudflare全家桶吧!

  • 使用cloudflare的worker、R2存储实现简易版文件服务器
  • 写2个脚本,分别用于:
    • 证书申请服务器,申请证书后上传证书文件(加密)
    • 使用证书的服务器,2个月下载一次证书文件(解密+部署)

一、基于cloudflare workers和R2存储实现的文件中转服务器

参考blog.csdn.net/Ireviewstar... ,改造一番实现简单文件中转服务器,但是加上了鉴权。

除了证书分发,还可用于存储个人文件,支持文件上传、下载、删除

支持凭据鉴权

文件服务器部署到cloudflare

代码:github.com/Carnia/clou...

  1. 首先你得有cloudflare账号,并且开启R2存储
  2. 在cloudflare新建一个worker,将此仓库的index.js拷贝进worker并部署

3. 在此worker的设置选项中内新建环境变量AUTH_KEY_SECRET,并设置一个你记得住的密码(用于网页或者接口鉴权,放在请求头X-Custom-Auth-Key里)

  1. 在cloudflare新建一个R2存储桶,随意命名。
  2. 在worker中绑定此R2存储桶,并赋予此桶变量名FILE_BUCKET

6. 再次部署worker

此时在打开cloudflare给你的域名,就可以看到web管理界面。

同时还支持直接通过api上传、下载、删除。

部署之后,API也就能用了

不需要鉴权

查看文件列表: curl <https://your-worker.your-subdomain.workers.dev/>

下载文件: curl <https://your-worker.your-subdomain.workers.dev/filename.txt>

需要鉴权

上传文件: curl -X PUT <https://your-worker.your-subdomain.workers.dev/filename.txt> --data-binary @filename.txt -H "X-Custom-Auth-Key: your-auth-key"

删除文件: curl -X DELETE <https://your-worker.your-subdomain.workers.dev/filename.txt> -H "X-Custom-Auth-Key: your-auth-key"

接下来就是证书上传、下载的脚本了

服务器A 申请完证书,通过此接口将证书加密压缩后上传到cloudflare的R2存储:

sh 复制代码
#!/bin/bash

# 配置参数
AUTH_KEY="your-auth-key"
WORKER_URL="https://your-worker.your-subdomain.workers.dev"
CERT_DIR="/cert"
OUTPUT_FILE="certs.tar.gz"
ENCRYPT_KEY="your-encryption-key"

# 1. 压缩并加密
tar -czf - $CERT_DIR | openssl enc -aes-256-cbc -salt -pass pass:$ENCRYPT_KEY -out $OUTPUT_FILE

# 2. 上传
curl -X PUT "$WORKER_URL/$OUTPUT_FILE" --data-binary @$OUTPUT_FILE -H "X-Custom-Auth-Key: $AUTH_KEY"

# 清理临时文件
rm -f $OUTPUT_FILE

服务器B 定期执行如下脚本:从cloudflare下载证书,解密解压后,重启依赖证书的应用

sh 复制代码
#!/bin/bash

# 配置参数
WORKER_URL="https://your-worker.your-subdomain.workers.dev"
FILE_NAME="certs.tar.gz"
ENCRYPT_KEY="your-encryption-key"
CERT_DIR="/cert"

# 1. 下载
curl -o $FILE_NAME "$WORKER_URL/$FILE_NAME"

# 2. 解密并解压
openssl enc -d -aes-256-cbc -pass pass:$ENCRYPT_KEY -in $FILE_NAME | tar -xzf - -C /

# 3. 执行nginx重启和refresh脚本
systemctl restart nginx # 可选
docker restart x-ui # 可选

# 清理临时文件
rm -f $FILE_NAME

当然,这2个脚本只是简单示例,还可以加上通知,完整示例见:github.com/Carnia/clou...

最后

感谢赛博大善人CLOUDFLARE!

相关推荐
逍遥德16 分钟前
CSS可以继承的样式汇总
前端·css·ui
秋野酱18 分钟前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
读心悦23 分钟前
CSS3 选择器完全指南:从基础到高级的元素定位技术
前端·css·css3
小明.杨35 分钟前
Django 中时区的理解
后端·python·django
有梦想的攻城狮37 分钟前
spring中的@Async注解详解
java·后端·spring·异步·async注解
qq_12498707531 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
lybugproducer1 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存
焚 城2 小时前
.NET8关于ORM的一次思考
后端·.net
_龙衣2 小时前
将 swagger 接口导入 apifox 查看及调试
前端·javascript·css·vue.js·css3
进取星辰2 小时前
25、Tailwind:魔法速记术——React 19 样式新思路
前端·react.js·前端框架