阿里云、腾讯云的免费 SSL 证书相继从1年缩短3个月,意味着每三个月就得自己手动去云服务厂商那里申请一次新的 SSL 证书,那就麻烦了。

幸好遇见了 acme.sh,它可以把这一过程自动化,只要一次性配置好,后续就不用再操心 SSL 证书过期的事情了。

以 Ubuntu 系统的云服务器为例,记录一下操作过程。

1、安装 acme.sh

1.1、官方安装方式

acme.sh 官方地址:https://github.com/acmesh-official/acme.sh

以 root 账号 SSH 登录到服务器,切换到 /root 目录,执行安装(记得替换邮箱地址):

1
2
cd /root
curl https://get.acme.sh | sh -s email=xxx@mail.com

1.2、手动安装

如果执行很慢,也可以换个方式,直接拉取 Github 仓库代码:

1
2
3
cd /root
git clone https://github.com/acmesh-official/acme.sh
mv acme.sh .acme.sh

这里为啥把仓库重命名为 .acme.sh 呢,就是为了上面那种安装方式保持一致嘛。

因为是手动安装,所以为了 acme.sh 命令能够全局执行,还需要在 /root/.bashrc 的最后添加一行:

1
. "/root/.acme.sh/acme.sh.env"

再执行 source .bashrc 重载环境变量。

现在就可以测试 acme.sh 命令是否可用:

1
acme.sh --version

手动安装的话,还需要执行命令安装一下定时任务(否则acme.sh无法自动给 SSL 证书续期):

1
acme.sh --install-cronjob

至此安装完毕。

2、阿里云 RAM API key

我的域名在阿里云,在 acme.sh 申请 SSL 证书时,验证域名所有权,需要阿里云授权。

为了更安全,可以用阿里云的 RAM API key,具体设置参考:https://ram.console.aliyun.com/users

阿里云账号里设置好后,会拿到一个 key 和 secret。

我们接着在服务器上执行:

1
2
export Ali_Key="<key>"
export Ali_Secret="<secret>"

后续 acme.sh 会读取这两个环境变量。

3、生成证书

1
./acme.sh --issue --dns dns_ali -d www.guozhenyi.com

耐心等待,acme.sh 会自动验证域名和申请 SSL 证书,全程旁观就好。

执行完,提示成功的话,就说明有效期3个月的 SSL 证书已经申请好了。

4、部署证书

接着,把 SSL 证书放到指定位置。我这里是在 /etc/nginx 建了个 cert 目录,用来存放证书。

1
mkdir -p /etc/nginx/cert

执行以下命令部署证书:

1
2
3
4
acme.sh --install-cert -d www.guozhenyi.com \
--key-file /etc/nginx/cert/acme_www.guozhenyi.com.key \
--fullchain-file /etc/nginx/cert/acme_www.guozhenyi.com.pem \
--reloadcmd "service nginx force-reload"

走到这一步,就代表使用 acme.sh 的所有流程已经完毕,后续在 SSL 证书过期之前,acme.sh 可以自动为我们“续期”(重新申请新的证书)。

5、Nginx 设置

贴一下我的 SSL 设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;

#ssl on;
ssl_certificate /etc/nginx/cert/acme_www.guozhenyi.com.pem;
ssl_certificate_key /etc/nginx/cert/acme_www.guozhenyi.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;

server_name www.guozhenyi.com;
root /var/www/website/public;
index index.html index.htm;

# ...
}

6、总结

整个过程还是比较顺利的,操作步骤也不多。终于不用担心 SSL 证书过期啦。

参考:
https://github.com/acmesh-official/acme.sh/wiki
https://github.com/acmesh-official/acme.sh/wiki/说明
https://github.com/acmesh-official/acme.sh/wiki/dnsapi

End–