我们网站几年来一直使用Let's Encrypt的免费SSL证书,在服务器上设置了定时检查、更新以后,每三个月证书会自动续期,也是不费事。后来部分网站接入了Cloudflare的CDN服务,无论是通过代理商的cname接入方式还是直接ns接入方式,源站服务器上的SSL证书更新都没有特别的问题。
但后来部分国内站点接入百度云加速的CDN服务后,源站上的SSL证书更新就有问题,无论是cname接入方式还是ns接入方式,下面来分别记录。
1、以cname方式接入百度云加速
域名解析服务还是由dnspod提供,源服务器上运行certbot-auto的时候会有报错:
Domain: amp.subdomain1.example.com Type: dns Detail: DNS problem: SERVFAIL looking up CAA for example.com - the domain's nameservers may be malfunctioning Domain: amp.subdomain2.example.com Type: dns Detail: DNS problem: query timed out looking up CAA for example.com Domain: mip.subdomain3.example.com Type: dns Detail: DNS problem: query timed out looking up CAA for subdomain3.example.com
需要根域名example.com、上级域名subdomain3.example.com(如果有的话)、子域名本身都是A记录,而不是CNAME记录,这时可以临时或者永久暂停以前的CNAME记录,添加A记录,然后等修改的记录生效后(可能几分钟,也可能需要很多个小时,生效后用户访问源站而不是百度云加速),再次运行certbot-auto就可以看到成功信息,然后根据需要把临时的A记录暂时、重新启动CNAME记录,让百度云加速生效。
顺便记录一下,今天运行certbot-auto一直报错:
An unexpected error occurred: There were too many requests of a given type :: Error creating new order :: too many currently pending authorizations: see https://letsencrypt.org/docs/rate-limits/
在网上找了好些办法,最后是把/etc/letsencrypt/accounts 目录改一个备份名字,然后使用下面的命令重新注册:
certbot-auto register
然后再运行以前生成SSL证书的脚本。
2、以ns方式接入百度云加速
因为百度云加速里面的dns解析服务不规范(未对CAA记录查询提供符合标准的返回信息),所以也无法让源站上的Let's Encrypt证书自动续期,需要人工在域名注册商的后台(我们是用的阿里云或者Godaddy来注册的域名)把ns服务临时改为其它服务商,例如dnspod,等生效后访问者是访问源站,再重新运行certbot-auto就可以看到成功信息,然后去域名注册商的后台把ns服务再次改为百度云加速的ns服务器,让百度云加速生效。
这个过程很折腾人,各种情况我们花了好几天来做研究、尝试。而这种操作也不是一次性的,每三个月都需要人工来操作一次,子域名很多的情况下,还要把生成的证书手工上传到百度云加速后台。希望百度云加速早点把dns解析服务中的这个Bug解决吧,也不是我们一家反映这个问题了。
还有个更气人的:百度云加速悄悄把所有海外节点都取消了,也没有任何公告,当我们自己发现国外网站打开很慢、去咨询他们企业QQ客服的时候,才告诉我们说近期他们与Cloudflare的合作出了问题,暂时没有海外节点提供了。这像是大公司做的事情吗?真是很让人无语😓。
2021-10-15两点更新:
- 百度云加速与Cloudflare的合作分手了,同一个域名的不同子域名可以分别接入百度云加速和Cloudflare,域名接入Cloudflare,DNS也用Cloudflare的,可以把子域名用cname方式接入百度云加速;
- 如果这些接入百度云加速的子域名的Letsencrypt的SSL证书更新的时候如果遇到CAA方面的报错,可以在Cloudflare的DNS中添加对应子域名的CAA记录来解决。
评论2
那还是不接了吧
那还是不接了吧我也遇到这个问题,但后来发现一个比较简单的方法
我也遇到这个问题,但后来发现一个比较简单的方法,就是dnspod是支持按线路添加解析的。由于Let's Encrypt验证是国外的线路,这样直接添加一个境外线路,指向原服务器ip就可以了。不过,对于海外用户比较多的网站,这一招就不行了。