通过Vercel A Record指向Linode服务器的api子域名无法续期Let's Encrypt SSL证书
通过Vercel A Record指向Linode服务器的api子域名无法续期Let's Encrypt SSL证书
我来帮你拆解下问题根源,再给几个实用的解决办法:
问题核心
你现在的域名DOMAINA已经把权威DNS服务器切换到Vercel的ns1.vercel.com了——简单说,所有针对这个域名的DNS查询(包括Let's Encrypt验证需要的_acme-challenge.api.DOMAINA TXT记录),都会优先去Vercel的DNS服务器查找。但你还是用原来的Linode插件让Certbot在Linode的DNS里添加验证记录,这就像把开门的钥匙放在了已经废弃的旧柜子里,Let's Encrypt自然找不到。
解决方案
方案1:改用Certbot的Vercel DNS插件(推荐,全自动化续期)
既然域名DNS托管在Vercel,直接用适配Vercel的Certbot插件来处理DNS验证是最省心的:
- 先安装Vercel插件:根据你的系统环境,用pip安装即可,比如
pip install certbot-dns-vercel - 去Vercel账户后台生成一个有DNS管理权限的API令牌:在Vercel的「Settings」→「Tokens」页面创建,权限选
Domains相关项就可以 - 创建一个安全的配置文件,比如
~/.certbot-vercel.ini,内容如下:
记得给这个文件设置严格权限,防止被其他用户读取:dns_vercel_token = 你的Vercel API令牌内容chmod 600 ~/.certbot-vercel.ini - 最后运行续期命令,指定使用Vercel插件:
这样Certbot会自动在Vercel的DNS里添加验证需要的TXT记录,验证完成后还会自动删除,全程无需手动干预。sudo certbot renew --dns-vercel --dns-vercel-credentials ~/.certbot-vercel.ini
方案2:手动添加TXT记录到Vercel DNS(适合临时应急)
如果不想折腾插件,也可以手动完成验证:
- 先运行测试续期,获取需要的TXT记录内容:
命令输出里会明确告诉你,需要给sudo certbot renew --dry-run_acme-challenge.api.DOMAINA添加的TXT值是什么 - 打开Vercel的域名管理界面,找到
DOMAINA的DNS设置,添加一条TXT记录:主机名填_acme-challenge.api,值填刚才获取的内容 - 等待DNS生效(可以用
nslookup -type=TXT _acme-challenge.api.DOMAINA验证,直到能查到对应记录),再运行正式的续期命令:
缺点是每次续期都要重复这些步骤,不如插件自动化省心。sudo certbot renew
方案3:切换到HTTP-01验证方式(如果API服务器支持HTTP访问)
如果你的Linode上的API服务器可以对外提供HTTP服务(80端口能正常访问),可以改用HTTP验证替代DNS验证:
- 如果你的API服务已经有web根目录,用webroot插件:
Certbot会在这个目录下创建临时验证文件,Let's Encrypt通过sudo certbot renew --webroot -w /path/to/your/api/webroothttp://api.DOMAINA/.well-known/acme-challenge/xxx访问完成验证 - 如果没有运行web服务,用standalone模式(会临时占用80端口,需要先停止占用该端口的服务):
sudo certbot renew --standalone
额外注意事项
- 检查Vercel DNS里有没有旧的
_acme-challenge记录,避免出现记录冲突 - 可以把DNS记录的TTL设短一点(比如300秒),这样修改记录后生效更快
- 每次操作后可以用
dig _acme-challenge.api.DOMAINA TXT或者nslookup工具,验证记录是否正确解析
备注:内容来源于stack exchange,提问作者biscuitstack
相关产品推荐
相关产品推荐

