我利用到了这个开源项目 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验证的方式
acme.sh --issue --dns -d "*.conix.ml" --yes-I-know-dns-manual-mode-enough-go-ahead-please
脚本的回显提示我们加添一个_acme-challenge.conix.ml
的TXT DNS解析记录,并将值设置为Y2U_vKtQ2umHtsL9LQ37QV-SovNvELzX4HgT4ePfkaw。
2、在域名服务商那里添加记录,我的域名的DNS服务商是CloudFlare。为了增快解析生效速度,将TTL设置为1min。
我们可以在windows命令行里使用nslookup -q=txt
查看TXT记录是否生效。
3、确定生效后,将之前命令里的--issue
更改为--renew
acme.sh --renew --dns -d "*.conix.ml" --yes-I-know-dns-manual-mode-enough-go-ahead-please
可以看到其中醒目的sucess,我们已经成功生成了证书,它的目录在~/.acme.sh/*.conix.ml
下
4、但是官方不推荐我们直接使用这些证书,而是使用类似以下命令放到我们想放的地方。【Tips 文件夹需要首先建好】
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
5、接下来我们尝试SSL证书是否生效,我们选择一个二级域名 test.conix.ml,设置A记录将DNS解析到你的服务器ip。
然后nginx写配置文件
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 --list
删除证书
acme.sh remove <SAN_domains>
如果需要手动续签,则执行
acme.sh --renew -d <SAN_domains> --force