AWS EC2环境运行Certbot申请SSL证书域名认证失败求助
报错根因
你收到的unauthorized报错核心原因是Let's Encrypt的ACME校验请求访问http://matthieuxroger.com/.well-known/acme-challenge/xxx路径时,没有拿到Certbot生成的校验文件,反而返回了你站点的首页HTML内容,常见触发原因如下:
- 使用
--standalone模式时,80端口已经被你运行的Node.js服务占用,Certbot无法启动临时的80端口监听服务处理校验请求,所有80端口请求都被转发到Node服务返回首页 - 使用
--webroot模式时,要么是你指定的webroot路径和Node服务的静态资源目录不匹配,要么是Node服务没有配置对应.well-known/acme-challenge路径的静态资源访问规则,导致无法返回校验文件 - 你当前的场景已经能返回站点内容,所以可以排除AWS EC2安全组80端口未开放、域名解析错误的问题
解决方案
方案1:临时停服务申请(适合快速测试)
- 停止占用80端口的Node.js服务,如果你用pm2管理进程可以执行:
pm2 stop <你的Node服务名称>,如果是前台运行直接终止进程即可 - 重新执行standalone模式申请命令:
sudo certbot certonly --standalone -d matthieuxroger.com - 证书申请完成后再重启Node.js服务即可,缺点是后续证书自动续期时仍需要临时停服务
方案2:配置Node服务适配webroot模式(无需停服务,推荐)
- 提前创建好校验文件的存放目录,例如:
sudo mkdir -p /var/www/matthieuxroger/.well-known/acme-challenge - 在你的Node.js服务代码中添加静态资源路由规则,以Express框架为例:
app.use('/.well-known/acme-challenge', express.static('/var/www/matthieuxroger/.well-known/acme-challenge')) - 重启Node.js服务让配置生效
- 执行webroot模式申请命令:
sudo certbot certonly --webroot -w /var/www/matthieuxroger -d matthieuxroger.com - 该方案后续Certbot自动续期无需停服务,适配生产环境使用
方案3:新增Nginx反向代理(适合长期运维,更推荐)
- 安装Nginx:
sudo apt update && sudo apt install -y nginx - 修改Node.js服务监听端口为非80端口(例如3000端口),配置Nginx 80端口反向代理到Node服务,同时配置校验路径的静态规则
- 直接使用Certbot的Nginx插件一键申请证书并自动配置SSL:
sudo certbot --nginx -d matthieuxroger.com - 该方案不需要修改Node服务的校验路由,Certbot会自动处理证书配置和自动续期逻辑,还能实现静态资源加速、多站点部署等能力
申请完成的证书默认存放在/etc/letsencrypt/live/matthieuxroger.com/目录下,其中fullchain.pem为证书链文件,privkey.pem为私钥文件,按需配置到你的服务中即可。
内容的提问来源于stack exchange,提问作者BeanieGod
相关产品推荐
相关产品推荐

