Let ’ s Encrypt 自从公测以来,就唤起了各路开发者的兴趣,第三方自动化脚本也是雨后春笋般出现。但是 Let ’ s Encrypt 与其它 CA 签发证书时验证域名所有权不太相同,它使用 ACME-server 进行域名验证,原理就是验证服务器指定在客户端服务器的一个随机的目录下生成一个随机的文件,然后验证是否能下载到这个文件。
本来这是个很方便的验证方法——更符合自动化的需求,但是,这也是 Let ’ s Encrypt 被抱怨的地方之一,很多情况下无法满足这个验证流程,比如我今天遇到的, 80 端口被完完全全 block 掉的情况。
于是后来,更多的人开始呼吁支持 DNS 方式验证,最终 Let ’ s Encrypt 终于支持了 DNS 验证域名所有权。
支持 DNS 验证的第三方自动化工具也不少,letsencrypt.sh就是其中之一,下面我来向大家分享一下我使用 letsencrypt.sh 并且结合 DNSpod 的 API 实现自动化签署 Let ’ s Encrypt 证书的过程,如果你使用其他的 DNS 服务,那么在后面调用 hook 的地方,改为你所使用的 API 即可。
git clone https://github.com/lukas2511/letsencrypt.sh.git
cd letsencrypt.sh
nano domains.txt
下面是和 DNSpod 相关的,如果你使用的不是 DNSpod ,可以直接跳到编辑 hook.sh 。
在 DNSpod 中添加一条 TXT 记录,主机名为_acme-challenge.<subname>
。比如我要签发 wiki.lizhe.org 这个域名的证书,那么我就添加_acme-challenge.wiki 这个主机名。值随便写,后面签发时程序会自动改。
curl -k https://dnsapi.cn/Domain.List -d "login_email=xxx&login_password=xxx"
curl -k https://dnsapi.cn/Record.List -d "login_email=xxx&login_password=xxx&domain_id=xxx"
cp hook.sh.example hook.sh
nano hook.sh
找到deploy_challenge
这个函数,$TOKEN_VALUE
就是我们需要更改的 TXT 记录值,对于 DNSpod ,通过我们前面找到的域名 id 和记录 id 进行更新。
deploy_challenge
函数中curl -k https://dnsapi.cn/Record.Modify -d "login_email=xxx&login_password=xxx&domain_id=xxx&record_id=xxx&sub_domain=_acme-challenge.xxx&record_type=TXT&record_line=默认&value=${TOKEN_VALUE}"
记得把 xxx 都改成你自己的参数,注意sub_domain
里还有个 xxx ,sub_domain
的前缀我已经帮你加好了。
./letsencrypt.sh -c -k ./hook.sh -t dns-01
如果一切顺利,那么在 certs 下面在各个以域名命名的文件夹下就会有证书文件了,privkey.pem
是私钥,fullchain.pem
是拼好的完整证书链,其他的文件就不用管了。
如果不想把证书文件放在当前路径,在 hook.sh 的deploy_cert
函数中,将生成的相应证书移动到目标目录即可。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.