官方文档: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/
常用的服务商别名:
DNSPod.com --> dns_dp
CloudFlare.com --> dns_cf
Name.com --> dns_namecom
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-upgradeacme会创建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;
}
