之前是使用的certbot申请的Let’s Encrypt的证书,最近快到期了,今天把证书申请脚本换成了acme.sh,这个脚本默认的CA提供商是ZeroSSL。这里只是简单记录下今天安装acme.sh的过程,像自动续期等功能没去花精力折腾,快到期了上机器手动执行下脚本也还好
软件安装
安装socat
1
dnf install socat
这个软件是acme.sh建议安装的,用于支持standalone方式获取证书,具体的我没有试验过
从域名提供商获取DNS的访问Key(各提供商的地址参考资料1), 然后将Key写入环境变量
1
2
3
4
5
6#定义一个用于放环境变量的文件
vi /etc/profile.d/example.sh
#写入Key,注意这个Key应该要有读写权限,别只弄个只读的Key
export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
#保存,然后使用以下命令让环境变量生效
source /etc/profile通过env命令查看环境变量是否确实生效
安装acme.sh
1
curl https://get.acme.sh | sh -s [email protected]
注意这里邮箱是有必要填写的,安装完毕后关闭终端,重新登录。
无论是否对申请证书有帮助,先开启80和443端口
1
2
3
4
5
6
7
8查询80端口是否打开
firewall-cmd --zone=public --query-port=80/tcp
打开80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
打开443端口
firewall-cmd --zone=public --add-port=443/tcp --permanent
更新防火墙规则
firewall-cmd --reload执行脚本生成证书(默认CA是ZeroSSL,上面填写的邮箱会被用来注册ZeroSSL账号)
1
acme.sh --issue --dns dns_namesilo --dnssleep 500 -d example.com -d *.example.com
指定CA
1
acme.sh --issue --dns dns_namesilo --dnssleep 500 --server letsencrypt -d example.com -d *.example.com
如果要更换默认CA,可以通过以下命令,以
letsencrypt
为例1
acme.sh --set-default-ca --server letsencrypt
这里的500是等待TXT记录生效的一个时间,实践下来发现好像不能搞太长了,否则会报Timeout错误,用于CA证书提供商来验证我们的域名归属,一般我们通过以下命令查看TXT证书是否已生效
1
nslookup -qt=txt _acme-challenge.example.com
如果实际操作中发现900秒不足以使得执行以上命令时能拿到最新的TXT记录,则需要相应地调长这个等待时间
异常情况:
如果修改了步骤2中的环境变量的值,则需要进入
.acme.sh/
文件夹修改account.conf
文件中的对应变量值,否则脚本将一直使用旧值,导致DNS记录修改失败,特别坑如果显示
Processing, The CA is processing your order, please just wait. (29/30)
, 最终提示Timeout
,证书申请失败,临时关闭下防火墙,弄完后再打开(先不要关闭防火墙,实在不行了再用这招试试)1
systemctl stop firewalld.service
配置Nginx,在配置文件的server下添加以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25server_name example.com;
listen 443 ssl http2;
ssl on;
root /usr/share/nginx/html;
index index.html;
#SSL 证书文件路径,由证书签发机构提供
ssl_certificate /etc/nginx/cert/cert.pem;
#SSL 密钥文件路径,由证书签发机构提供
ssl_certificate_key /etc/nginx/cert/cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
#ssl_ciphers配置较长,这里删除了
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_buffer_size 1400;
ssl_stapling on;
ssl_stapling_verify on;
#国内填 223.5.5.5 223.6.6.6,国外填 8.8.4.4 8.8.8.8
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";安装证书到指定路径并重启Nginx
1
2
3
4acme.sh --install-cert -d example.com \
--key-file /etc/nginx/cert/cert.key \
--fullchain-file /etc/nginx/cert/cert.pem \
--reloadcmd "service nginx force-reload"手动续期
1
acme.sh --renew -d example.com --force
更新acme.sh
1
acme.sh --upgrade --auto-upgrade