Skip to content
On this page

acme证书生成

参考链接

安装acme.sh

替换命令行中的your_email,这个Email用于申请Let's Encrypt证书时使用

bash
curl https://get.acme.sh | sh -s email=your_email
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环境变量

bash
vim ~/.bashrc
vim ~/.bashrc
bash
# DNSPod.com
export DP_Id="xxx"
export DP_Key="xxx"
# Name.com
export Namecom_Username="xxx"
export Namecom_Token="xxx"
# 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服务指令才能使新证书生效。

bash
# 添加一个存放证书的目录
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"
# 添加一个存放证书的目录
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配置中填入证书路径为:

shell
# nginx配置
ssl_certificate "/etc/nginx/ssl/your_domain.wildcard.cer";
ssl_certificate_key "/etc/nginx/ssl/your_domain.wildcard.key";
# 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.

单域名证书

bash
# 以DNSPod.com服务商为例
acme.sh --issue --dns dns_dp -d {your_domain}
# 以DNSPod.com服务商为例
acme.sh --issue --dns dns_dp -d {your_domain}

三、自动续签

开启自动更新acme.sh

bash
acme.sh --upgrade --auto-upgrade
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配置

bash
# 证书通用配置
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;
}
# 证书通用配置
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;
}