利用acme.sh快速获取SSL证书

背景

之前我的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验证的方式
1
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

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

    DNS

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

    nslookup

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

    1
    acme.sh --issue --dns -d "*.conix.ml" --yes-I-know-dns-manual-mode-enough-go-ahead-please

    success

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

    证书

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

    1
    2
    3
    4
    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

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

    A

    然后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
    34
    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接口实现全自动生成的。


利用acme.sh快速获取SSL证书
https://wuuconix.link/2022/01/29/acme-sh/
作者
wuuconix
发布于
2022年1月29日
许可协议