前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用acme.sh快速获取SSL证书 - wuuconix's blog

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

作者头像
wuuconix
发布2023-03-16 15:57:31
1.4K0
发布2023-03-16 15:57:31
举报
文章被收录于专栏:wuuconixwuuconix

背景

之前我的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
--issue

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

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

DNS
DNS

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

nslookup
nslookup

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

代码语言:javascript
复制
acme.sh --issue --dns -d "*.conix.ml" --yes-I-know-dns-manual-mode-enough-go-ahead-please
success
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
install-cert

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

A
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

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

国外老哥
国外老哥

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年1月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 过程
  • 另外想说的
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档