acme证书生成
安装acme.sh
替换命令行中的your_email
,这个Email用于申请Let's Encrypt证书时使用
curl https://get.acme.sh | sh -s email=your_email
安装目录: ~/.acme.sh/
。后续生成的证书这个目录下都会存放一份
安装完成后会自动创建一个alias指令: acme.sh
【找不到命令请执行: source ~/.bashrc
或者重启终端】
生成证书
一、验证域名所有权
方法一:添加一条txt解析记录(每生成一次证书都需要不同的txt记录,太过麻烦.)
方法二(推荐): 通过域名解析商提供的API-Token来自动完成验证域名所有权(acme脚本生成证书后会移除txt解析记录)
添加域名DNS服务商Token环境变量
vim ~/.bashrc
# DNSPod.com
export DP_Id="xxx"
export DP_Key="xxx"
# Name.com
export Namecom_Username="xxx"
export Namecom_Token="xxx"
二、生成证书
默认保存目录: ~/.acme.sh/you_domain/
常用的服务商别名:
- DNSPod.com --> dns_dp
- cloudflare.com --> dns_cf
- Name.com --> dns_namecom
- 更多
泛域名证书
TIP
acme会创建cronjob(定时任务), 每天 0:00 点检测所有的证书, 如果快过期了会自动更新证书,更新证书的命令会与生成证书时的命令保持一致,所以最好在生成证书时指定存放路径: --key-file
和 --fullchain-file
这条命令会作为日后自动续签时使用的命令,所以需添加重启nginx服务指令才能使新证书生效。
# 添加一个存放证书的目录
mkdir /etc/nginx/ssl
#
acme.sh --force \
--install-cert \
--issue \
--dns dns_dp \ # 指定服务商: DNSPod.com --> dns_dp cloudflare.com --> dns_cf Name.com --> dns_namecom
-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"
参数说明
--dns:指定域名解析商
-d:指定域名,可多个
执行成功后会生成四个文件,ningx SSL配置主要使用: fullchain.cer
公钥 和 {your_domain}.key
私钥, 因为我们在命令行中制定了--fullchain-file
和--key-file
路径,所以在nginx配置中填入证书路径为:
# nginx配置
ssl_certificate "/etc/nginx/ssl/your_domain.wildcard.cer";
ssl_certificate_key "/etc/nginx/ssl/your_domain.wildcard.key";
TIP
如果将fullchain.cer替换成{your_domain}.cer, 部分浏览器https将会报红, 原因是证书链不完整,评测地址:https://www.ssllabs.com/ssltest/index.html
This server's certificate chain is incomplete. Grade capped to B.
单域名证书
# 以DNSPod.com服务商为例
acme.sh --issue --dns dns_dp -d {your_domain}
三、自动续签
开启自动更新acme.sh
acme.sh --upgrade --auto-upgrade
acme会创建cronjob(定时任务), 每天 0:00 点检测所有的证书, 如果快过期了会自动更新证书,更新证书的命令会与生成证书时的命令保持一致,所以最好在生成证书时指定存放路径: --key-file
和 --fullchain-file
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;
}