跳转至

SSL 证书申请及更新简易指南

预计阅读时长 : 9 分钟

配置域名

从使用广泛性和便捷性的角度考虑,网站 SSL 证书一般使用 主域名 + 通配符泛域名 的组合类型最为合适。

虽然这类免费证书有效期一般也就 60 天,但是借助自动续期工具,就能变相实现证书无限期有效。

DNS API 配置

本文以 10.icu 这个域名为例,一步一步进行操作指引。我们使用的工具是 acme.sh ⧉,并且域名注册和解析在 DNSPod ⧉ 上。

为了能够在 acme.sh ⧉ 中使用 DNS 验证方式,我们需要先在 DNSPod 中创建一个 API Token ⧉,然后将 Token 保存在服务器上,以便 acme.sh 脚本使用。

安装 acme.sh

接下去,在服务器上安装 acme.sh 脚本,其中 email 地址请更改为自己的邮箱。

curl https://get.acme.sh | sh -s email=my@example.com

安装 FAQ

如果官方地址下载太慢,可以使用国内的备用地址, https://gitcode.net/cert/cn-acme.sh/-/raw/master/install.sh?inline=false

如果提示 curl: command not found,则需要先安装curl,然后再运行 acme.sh 安装命令。

Debian/Ubuntu及衍生系统可使用:apt install -y curl,CentOS/RHEL/Aliyun OS等衍生系统可使用:yum install -y curl

虽然官方文档中说安装之后会自动在终端配置文件中添加 alias,但是实际上可能并没有成功,因此建议手动检查和添加一下。

1
2
3
# acme.sh
. "/root/.acme.sh/acme.sh.env"
alias acme.sh=~/.acme.sh/acme.sh

安装完成后重新加载 Bash 或者 Zsh,即可使 acme.sh 生效:

source ~/.zshrc

接下去,我们在 /root/.acme.sh/account.conf 中配置 DNSPod 中生成的 API Token,以便脚本能够自动化申请证书。

export DP_Id="471234"
export DP_Key="4637cexxxxxxxxxxxxxxxxx80bfaa"

申请证书

安装及配置好 acme.sh 之后,就可以使用使用 Shell 脚本进行自动化申请了。因为要同时涵盖 主域名 + 通配符泛域名,因此需要 -d 参数指定两个域名。

acme.sh --issue --server letsencrypt --dns dns_dp -d "*.10k.icu" -d 10k.icu

当脚本成功执行,并显示以下输出时,SSL 证书的申请就成功了。

1
2
3
4
Your cert is in: /root/.acme.sh/*.10k.icu_ecc/*.10k.icu.cer
Your cert key is in: /root/.acme.sh/*.10k.icu_ecc/*.10k.icu.key
The intermediate CA cert is in: /root/.acme.sh/*.10k.icu_ecc/ca.cer
And the full chain certs is there: /root/.acme.sh/*.10k.icu_ecc/fullchain.cer

默认加密方式

注意:目前 acme.sh 脚本默认使用的是 ECC 证书,如果需要使用 RSA 证书,需要在命令中添加 --keylength 2048 参数。

加密方式的不同会影响生成的文件夹名称以及之后的部署参数,因此需要注意其中的细微差别。

acme.sh --install-cert -d "*.10k.icu" --ecc \--fullchain-file /etc/nginx/ssl/"*.10k.icu.crt" \--key-file /etc/nginx/ssl/"*.10k.icu.key" \--ca-file /etc/nginx/ssl/"*.10k.icu.ca.crt"

通配符

如果域名中包含通配符,需要使用 "" 将命令中的域名包裹起来 ,以便正确识别文件名和路径。

然后,在 Nginx 配置中指定对应的证书文件路径,

Nginx 中 SSL 配置
1
2
3
4
5
6
7
server{
    server_name news.10k.icu;
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/*.10k.icu.crt;
    ssl_certificate_key /etc/nginx/ssl/*.10k.icu.key;
    ssl_trusted_certificate /etc/nginx/ssl/*.10k.icu.ca.crt;
    }

最后,使用 systmectl restart nginx 重启 Nginx 服务,开始享受 SSL 安全之旅吧。

自动更新

acme.sh 安装成功后会自动创建 cron 执行定时任务,输入 crontab -l 命令,能看到如下输出:

4 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /root/.acme.sh/ssl.log

以上的脚本会每天执行一次,检查证书的有效期,并在过期之前重新申请,确保证书能持续有效。

  1. 4 0 * * * : 这是 Cron 的时间表达式,表示每天凌晨 0 点 4 分执行一次。
  2. "/root/.acme.sh"/acme.sh : 这是要执行的脚本路径。它位于 /root/.acme.sh 目录下,脚本名为 acme.sh
  3. --cron : 这是 acme.sh 的一个参数,指示脚本以 cron 模式运行,这意味着脚本会检查所有由它管理的证书,并在需要时自动续期。
  4. --home "/root/.acme.sh" : 这个参数指定了 acme.sh 的运行目录,即脚本、配置文件、证书文件存储的位置。
  5. > /var/log/ssl.log : 这部分将任务的输出(包括标准输出和标准错误)重定向到 /var/log/ssl.log 文件。

如果长时间不重启 Nginx 服务,可能出现 SSL 证书更新之后,Nginx 服务没有重新加载证书的情况,这时候可以使用 systemctl reload nginx 命令重新加载证书。

更自动化的方式是,修改 Crontab 中的指令,在最后加上 && systemctl reload nginx,这样每次证书更新之后,都会自动重启 Nginx 服务。

4 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /root/.acme.sh/ssl.log && systemctl reload nginx

证书查看

为了查看目前申请的证书,可以使用 acme.shlist 参数:

acme.sh --list

如果自动续期没有成功,则可以使用手动方式进行续期:

acme.sh --renew -d "*.10k.icu" -d "10k.icu" --force --ecc

参考链接