letsencrypt 配合 cloudflare CDN 使用 作者: morningp 时间: 2020-03-06 分类: 技术笔记,建站相关 之前建站的时候使用的是cloudflare的CDN并且开启了全程https,由于是Full (strict)模式,所以我就选择了letsencrypt证书,但是在证书自动更新脚本运行的时候,却遇到了一个很大的问题... 这个问题就是certbot无法更新证书。通过日志观察发现是letsencrypt认证的时候出现了问题。Google了一下才发现原来letsencrypt认证很简单:通过80端口访问你的网站,然而网站套了cloudflare的CND后关闭了80端口,所以自然判定失败无法更新证书。 那么要如何使得letsencrypt可以正常更新证书呢?这里介绍两个方案: - 让letsencrypt通过DNS认证 这个方案很简单,也是Google搜索到的普遍的一个解决方案,即在DNS记录中添加一条名为_acme-challenge.的TXT记录,内容则是letsencrypt给你的一串随机字符串。但是我在使用中遇到了一个问题:DNS记录更新太慢,最后certbot超时退出命令。这种方法大家可以自行搜索执行。 - 暂时取消CDN,更新证书之后再开启 这个方法算是我想出来的(反正是没有Google到这种人...w),我手动通过这种方法成功更新了letsencrypt证书,但是每三个月手动操作一次很累,而且也不一定能记住,那么写一个脚本就是最优的解决方案了,本来就有一个certbot renew的脚本,只需要略加修改就可以了。 脚本编写是需要调用cloudflare的API的,首先需要获取三个东西:zone_id,API_key以及DNS记录ID. 先获取zone_id,这个在 https://www.cloudflare.com/a/overview 页面右侧就有,记录下它; 再来是API_key,这个需要点击zone_id下面的Get your API Tokens进入一个新的页面,点击Global API Key后面的view,需要输入你clouflare的密码进行验证,记录下它; 最后是获取你DNS记录的id,这个需要先执行 ``` curl -X GET "https://api.cloudflare.com/client/v4/zones/8ee1be75cxxxx(我的zone_id)/dns_records" \ -H "X-Auth-Email: user@example.com(此处为cloudflare的邮箱)" \ -H "X-Auth-Key: xxxx(此处为api_key)" \ -H "Content-Type: application/json ``` 这时如果你的信息全部正确的话,会有回显: ``` { "success": true, "errors": [], "messages": [], "result": { "id": "(DNS解析ID)", "type": "A", "name": "example.com", "content": "IP", "proxiable": true, "proxied": false, "ttl": 120, "locked": false, "zone_id": "(zone_id)", "zone_name": "example.com", "created_on": "2014-01-01T05:20:00.12345Z", "modified_on": "2014-01-01T05:20:00.12345Z", "data": {}, "meta": { "auto_added": true, "source": "primary" } } } ``` 这里是一个json格式的段落,可能在终端会很乱,可以复制出来format一下,ID哪里就是你DNS的ID,记录下来。 最后就是拼装命令: ``` curl -X PUT "https://api.cloudflare.com/client/v4/zones/(记录下来的zone_id)/dns_records/xxxx(这条dns记录的id)" \ -H "X-Auth-Email: user@example.com(帐号的邮箱)" \ -H "X-Auth-Key: xxxx(记录下来的api_key)" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"example.domain.com(域名)","content":"IP(DNS记录的ip)","ttl":120(一般是120),"proxied":false}' ``` 瓶装完成后执行,如果成功的话访问cloudflare页面会发现这条记录后面的小云朵已经变成灰色的了,如果需要重新开启,需要将data内的"proxied":false改为"proxied":true。 所有工作准备完成后就可以进行脚本的编写了,需要注意的是DNS记录刷新需要时间,可以使用sleep命令来暂停脚本进行等待。 总的来说算是勉勉强强的做好了letsencrypt证书和cloudflare CDN的结合,后续如果有时间的话可能会尝试使用letsencrypt的DNS认证来试试看。(所以这篇其实是cloudflare API调用的内容?w 标签: none