为子域名扩展Let's Encrypt证书时出现Connection refused错误的技术求助
首先得帮你理清为啥会出现这个连接拒绝的问题:Let's Encrypt默认用的HTTP-01验证机制,要求公网能访问到你服务器上的.well-known/acme-challenge路径,但你的子域名是CNAME到Backblaze B2做URL掩码的——这意味着所有访问这个子域名的请求,都会被转到B2那边,根本到不了你的Apache服务器,Certbot在Apache上临时放的验证文件自然就访问不到了,所以才会报Connection refused。
那能不能实现你要的效果?答案是可以,但得换一种验证方式,用DNS-01挑战,这种方式不需要访问你的Web服务器,只需要你能修改域名的DNS记录来证明你对域名的控制权,刚好你的DNS托管在Cloudflare,Certbot有现成的插件可以自动完成这个流程,具体步骤如下:
具体操作步骤
第一步:获取Cloudflare API令牌
登录Cloudflare后台,创建一个API令牌,权限只需要勾选Zone > DNS > Edit,确保这个令牌只能操作你目标域名的DNS记录,这样更安全。第二步:安装Certbot的Cloudflare插件
如果是Debian/Ubuntu系统,直接跑这个命令:sudo apt install python3-certbot-dns-cloudflare其他系统(比如CentOS)可以用pip安装:
pip install certbot-dns-cloudflare第三步:创建Cloudflare凭据文件
找个安全的目录创建配置文件,比如~/.secrets/certbot/cloudflare.ini,内容只有一行:dns_cloudflare_api_token = 你的Cloudflare API令牌然后设置文件权限,避免其他用户读取:
sudo chmod 600 ~/.secrets/certbot/cloudflare.ini第四步:用DNS-01挑战重新扩展证书
运行下面的Certbot命令,指定用Cloudflare DNS验证:sudo certbot --expand -d sub.domain.com --authenticator dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini这个命令会自动让Certbot通过Cloudflare API添加验证用的TXT记录,等待Let's Encrypt验证通过后,就会自动把你的子域名添加到现有证书里。
额外注意事项
- 完成证书扩展后,如果你要继续用这个子域名做Backblaze B2的URL掩码,得确保你的Apache服务器配置了反向代理到B2的规则,同时要把新证书配置到这个子域名的虚拟主机里,这样HTTPS访问才能正常工作。
- 如果Cloudflare开启了橙色云(代理模式),不用担心,DNS-01挑战不受代理影响,因为它是直接验证DNS服务器上的记录,不需要经过Cloudflare的代理。
简单来说,你之前用的HTTP-01验证不适合子域名指向外部服务的场景,换成DNS-01验证就能解决问题啦~
备注:内容来源于stack exchange,提问作者kryz

