使用 acme.sh 配置自动续签 SSL 证书

1. 准备工作

  • 配置域名解析
  • 安装 Nginx
  • 开放服务器的 443/80 端口
1
2
3
4
5
6
7
server {
listen 80;
listen [::]:80;
server_name xxx.xxx xxx.xxx.xxx;
root /usr/share/nginx/html;
index index.html;
}

2. 安装 acme.sh

  • acme.sh 是一个集成了 ACME 客户端协议的 Bash 脚本,可以从 letsencrypt 生成免费的证书,作者是 @neilpangxa
1
2
3
4
5
6
7
$ curl https://get.acme.sh | sh -s email=xxx@xxx.xxx
$ source ~/.bashrc

# 开启自动更新
$ acme.sh --upgrade --auto-upgrade
# 使用letsencrypt的CA
$ acme.sh --set-default-ca --server letsencrypt

3. 生成证书

  • acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证:http 和 dns 验证。这里使用 http
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 签发证书,使用多个域名
$ acme.sh --issue -w /usr/share/nginx/html -d xxx.xxx -d xxx.xxx.xxx

# 安装证书
$ mkdir /etc/nginx/ssl
$ acme.sh --install-cert -d xxx.xxx \
--cert-file /etc/nginx/ssl/xxx.xxx.cer \
--key-file /etc/nginx/ssl/xxx.xxx.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--ca-file /etc/nginx/ssl/ca.cer \
--reloadcmd "systemctl restart nginx"

# 配置Nginx
$ vi /etc/nginx/nginx.conf
server {
listen 80;
listen [::]:80;
server_name xxx.xxx www.xxx.xxx;

location / {
rewrite ^/(.*)$ https://$host/$1 permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name xxx.xxx www.xxx.xxx;
root /usr/share/nginx/html;

ssl_certificate /etc/nginx/ssl/xxx.xxx.cer;
ssl_certificate_key /etc/nginx/ssl/xxx.xxx.key;
ssl_trusted_certificate /etc/nginx/ssl/ca.cer;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}

# 查看已安装证书信息
$ acme.sh --info -d xxx.xxx

参考