侧边栏壁纸
博主头像
chaoszhu'Blog

行动起来,活在当下~

  • 累计撰写 7 篇文章
  • 累计创建 10 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

acme证书生成&自动续期

chaoszhu
2025-11-15 / 0 评论 / 0 点赞 / 21 阅读 / 0 字

官方文档:https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E

一、安装acme.sh

安装目录: ~/.acme.sh/

安装完成后会有一个alias指令: acme.sh 【找不到命令请执行: source ~/.bashrc 或者重连终端】

curl https://get.acme.sh | sh -s email=anystring@gmail.com

二、生成证书

1. 配置Token环境变量

acme在生成证书前需验证域名所有权

方法一:添加一条txt解析记录(每生成一次证书都需要不同的txt记录,太过麻烦.)

方法二(推荐)通过域名解析商提供的API-Token来自动完成验证 (acme脚本生成证书后会移除txt解析记录)

添加域名DNS服务商Token环境变量

nano ~/.bashrc

# 腾讯云: https://console.dnspod.cn/account/token/token
export DP_Id=""
export DP_Key=""

# Name.com: https://www.name.com/account/settings/api
export Namecom_Username=""
export Namecom_Token=""

# cloudflare: https://dash.cloudflare.com/profile/api-tokens
# 方式一:编辑区域DNS令牌 + 区域ID 【测试可行,推荐】
export CF_Token=""    # 编辑区域DNS令牌
export CF_Zone_ID=""    # 区域ID

# 方式二:GlobalKey + 登录邮箱 【测试失败,不折腾...】
export CF_Key=""
export CF_Email=""

使用CloudFlare生成证书踩坑:

  • 按照文档的方式配置 cloudflare Global API Key+Email 无法添加TXT过验证.

  • 免费三级域名无论方式一还是方式二均无法添加TXT过验证,暂未知原因.

2. 生成证书

默认保存目录: ~/.acme.sh/you_domain/

常用的服务商别名:

2.1 泛域名证书

参数说明

  • --dns:指定域名解析商

  • -d:指定域名,根域名和二级泛域名

执行成功后会生成四个文件,主要使用:

  • 公钥: fullchain.cer

  • 私钥: {your_domain}.key

如果将fullchain.cer替换成{your_domain}.cer, 部分浏览器https将会报红, 原因是证书链不完整.

评测地址:https://www.ssllabs.com/ssltest/index.html

**This server's certificate chain is incomplete. Grade capped to B.**

# 直接生成在默认目录
# ~/.acme.sh
acme.sh --force --issue --debug --dns dns_cf -d your_domain -d *.your_domain --reloadcmd "x-ui restart"

# ======================================================================
# 自定义目录[这里以给nginx创建证书为例]
mkdir -p /etc/nginx/ssl

acme.sh --force \
  --installcert \ # 安装证书到指定路径
  --issue \
  --dns dns_dp \ # 服务商别名
  -d your_domain \
  -d *.your_domain \
  --key-file /etc/nginx/ssl/your_domain.wildcard.key \
  --fullchain-file /etc/nginx/ssl/your_domain.wildcard.cer \
  --reloadcmd "service nginx force-reload"

# nginx配置
ssl_certificate "/etc/nginx/ssl/your_domain.wildcard.cer";
ssl_certificate_key "/etc/nginx/ssl/your_domain.wildcard.key";

2.2 单域名证书

适用场景:梯子使用

# 直接生成在默认目录
# ~/.acme.sh
acme.sh --force --issue --dns dns_cf -d your_domain --reloadcmd "x-ui restart"

2.3 切换CA(证书提供商)

acme内置了多个CA,当CA(默认ZeroSSL)请求次数过多需要冷却时,可以尝试切换CA

# Let’s Encrypt ✔ 推荐
acme.sh --set-default-ca --server letsencrypt

#ZeroSSL(acme.sh 默认项) 可能会出现 “retryafter=86400” 等排队/卡住的问题
acme.sh --set-default-ca --server zerossl

acme.sh --set-default-ca --server buypass

acme.sh --set-default-ca --server buypass-go

acme.sh --set-default-ca --server google

三、自动更新acme版本

用于同步CA / 协议有变化时不用手动更新脚本

acme.sh --upgrade --auto-upgrade

acme会创建cronjob(定时任务), 每天自动检测所有证书, 如果快过期了会自动更新证书.

更新证书的命令会与生成证书时的命令保持一致.

四、acme.sh常用命令

  • 已安装证书列表: acme.sh --list

  • 查看已安装证书信息: acme.sh --info -d {your_domain}

  • 查看定时更新证书任务: crontab -l

  • 强制重新更新证书: acme.sh --renew -d example.com --force

  • 移除更新证书任务: acme.sh --remove -d example.com

  • 手动更新证书: "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force

    • 适用于未知原因导致的acme.sh脚本未自动续期,更新证书后需重启nginx

五、nginx泛域名server配置

server {

  listen 80; # 所有的80端口全都转到443https

  server_name ~^(?<domain>.+)$; # 分组捕获,输出的变量名为domain,供重定向使用

  return 301 https://$domain$request_uri;

}

server {

  listen 443 ssl;

  server_name ~^.*\.chaoszhu.com; # 只匹配chaoszhu.com这个已经申请泛域名的域名

  ssl_certificate ssl/chaoszhu.com.wildcard.cer;

  ssl_certificate_key ssl/chaoszhu.com.wildcard.key;

  ssl_session_timeout 5m;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照这个协议配置

  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#请按照这个套件配置

  ssl_prefer_server_ciphers on;

  # brotli on;

  gzip on;

  gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-icon;

  include /etc/nginx/default.d/*.conf;

  client_max_body_size  50m;

  # WebSocket 配置

  proxy_set_header Upgrade $http_upgrade;

  proxy_set_header Connection $connection_upgrade;

}

博主关闭了所有页面的评论