利用acme.sh快速获取SSL证书
背景
之前我的wuuconix.link
和wuuconix.xyz
域名的SSL证书都是通过 来此加密 - Let’s Encrypt 在线免费申请SSL证书 (osfipin.com) 申请的,它是一个网页端的SSL证书申请工具。
申请一个域名的SSL证书的步骤很简单。
- 填入域名
- 根据要求设置一个
_acme-challenge
的TXT DNS解析记录,它会提示你结果需要为什么。你到你的域名服务商设置好解析后,点击验证。 - 网站验证完毕后便可以下载证书
看起来非常简单,但是这个证书的有效期只有60天,所以你每隔两个月就需要重复着执行这个操作。更可恶的是,这个网站最近在验证DNS解析记录前增加了一段等待时间,而VIP则不需要,验证也需要等待半天,让人很无奈。而且我越来越觉得这个网站完全貌似不是Let's Encrypt
证书签发商的官方网站。
此外,今天闲来无事,在观看了(无需魔法)(无限续费)免费注册一年freenom域名_哔哩哔哩_bilibili 这个视频后,我在freenom上成功白嫖了一堆域名
想到以后每个域名都需要仍受 来此加密 恶心人的操作,我想试试之前早已耳闻的 脚本自动部署。
过程
我利用到了这个开源项目 acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol (github.com)
实际上,证书签发商Let’s Encrpt
为了简化自己的操作,设计了一个ACME的协议,用来实现SSL自动化签发,它的主要步骤就是用一条TXT DNS记录来验证这个域名的归属权是否属于你,若成功,便会进行自动生成SSL证书。
而这个项目acme.sh
便是该协议的纯shelll脚本客户端。
接下来我演示一下 conix.ml
这个域名下泛二级域名(*.conix.ml)的SSL证书生成过程。
- 使用手动dns验证的方式
1 |
|
脚本的回显提示我们加添一个_acme-challenge.conix.ml
的TXT DNS解析记录,并将值设置为Y2U_vKtQ2umHtsL9LQ37QV-SovNvELzX4HgT4ePfkaw
。
-
在域名服务商那里添加记录,我的域名的DNS服务商是CloudFlare。为了增快解析生效速度,将TTL设置为1min。
我们可以在windows命令行里使用
nslookup -q=txt
查看TXT记录是否生效。 -
确定生效后,将之前命令里的
--issue
更改为--renew
1
acme.sh --issue --dns -d "*.conix.ml" --yes-I-know-dns-manual-mode-enough-go-ahead-please
可以看到其中醒目的sucess,我们已经成功生成了证书,它的目录在
~/.acme.sh/*.conix.ml
下 -
但是官方不推荐我们直接使用这些证书,而是使用类似以下命令放到我们想放的地方。【Tips 文件夹需要首先建好】
1
2
3
4acme.sh --install-cert -d "*.conix.ml" \
--key-file /etc/nginx/conix.ml/key.pem \
--fullchain-file /etc/nginx/conix.ml/cert.pem \
--reloadcmd "service nginx force-reload" -
接下来我们尝试SSL证书是否生效,我们选择一个二级域名
test.conix.ml
,设置A记录将DNS解析到你的服务器ip。然后nginx写配置文件
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
34server
{
listen 443 ssl;# https 监听的是 443端口
server_name test.conix.ml;
keepalive_timeout 100;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /etc/nginx/conix.ml/cert.pem; # 证书路径
ssl_certificate_key /etc/nginx/conix.ml/key.pem; # 请求认证 key 的路径
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
index index.html index.htm;
location / {
root /var/www/html;
}
}
server
{
listen 80;
server_name test.conix.ml;
rewrite ^(.*) https://$server_name$1 permanent;
}在浏览器中访问。
成功进行SSL连接并且看到证书。
这里突然发现颁发者是ZeroSSL,看来acme.sh默认的证书签发商已经不再是Let’s Encryp了。
另外想说的
实际上acme.sh更强大之处可以利用DNS解析商提供的api接口,完全自动进行SSL证书的签发,即不用手动写TXT记录,而程序自动写,当然了,这需要你在环境变量里设置好你的服务商的api接口的token供acme.sh调用。
但是CloudFlare对Freenom上白嫖的顶级域名做了限制,使得这种更简单的方法对tk、ml、cf
等顶级域名失效。
这里引用一位国外老哥在CloudFlare论坛上的话来评价这种行为。
当然了,如果是正常购买的域名,完全可以用这种方式进行解析,我的wuuconix.link
的二级泛域名证书就是利用阿里云的api接口实现全自动生成的。