利用acme.sh快速获取SSL证书 - wuuconix's blog

背景

之前我的wuuconix.linkwuuconix.xyz域名的SSL证书都是通过 来此加密 - Let’s Encrypt 在线免费申请SSL证书 (osfipin.com) 申请的,它是一个网页端的SSL证书申请工具。

申请一个域名的SSL证书的步骤很简单。

  1. 填入域名
  2. 根据要求设置一个_acme-challenge的TXT DNS解析记录,它会提示你结果需要为什么。你到你的域名服务商设置好解析后,点击验证。
  3. 网站验证完毕后便可以下载证书

看起来非常简单,但是这个证书的有效期只有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证书生成过程。

  1. 使用手动dns验证的方式
代码语言:javascript
复制
acme.sh --issue --dns -d "*.conix.ml" --yes-I-know-dns-manual-mode-enough-go-ahead-please
--issue

脚本的回显提示我们加添一个_acme-challenge.conix.ml的TXT DNS解析记录,并将值设置为Y2U_vKtQ2umHtsL9LQ37QV-SovNvELzX4HgT4ePfkaw

在域名服务商那里添加记录,我的域名的DNS服务商是CloudFlare。为了增快解析生效速度,将TTL设置为1min。

DNS

我们可以在windows命令行里使用nslookup -q=txt查看TXT记录是否生效。

nslookup

确定生效后,将之前命令里的--issue更改为--renew

代码语言:javascript
复制
acme.sh --issue --dns -d "*.conix.ml" --yes-I-know-dns-manual-mode-enough-go-ahead-please
success

可以看到其中醒目的sucess,我们已经成功生成了证书,它的目录在~/.acme.sh/*.conix.ml

证书

但是官方不推荐我们直接使用这些证书,而是使用类似以下命令放到我们想放的地方。【Tips 文件夹需要首先建好】

代码语言:javascript
复制
acme.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"
install-cert

接下来我们尝试SSL证书是否生效,我们选择一个二级域名 test.conix.ml,设置A记录将DNS解析到你的服务器ip。

A

然后nginx写配置文件

代码语言:javascript
复制
server
{
   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

这里引用一位国外老哥在CloudFlare论坛上的话来评价这种行为。

国外老哥

当然了,如果是正常购买的域名,完全可以用这种方式进行解析,我的wuuconix.link的二级泛域名证书就是利用阿**的api接口实现全自动生成的。