导入ACM的自签名SSL证书在Nginx中无法正常工作
解决思路
核心问题:自签名证书不受浏览器信任
你通过openssl x509 -signkey生成的是自签名证书——这类证书没有经过全球浏览器信任的根证书颁发机构(CA)签发,浏览器默认会标记为“连接不安全”,这是问题的根本原因。
具体解决方向
1. 替换为受信任CA签发的证书(生产/公网访问推荐)
放弃自签名证书,改用受信任的CA证书:
- 通过AWS ACM申请免费公有证书:在ACM控制台选择“请求证书”,输入
test.mydomain.com作为域名,选择DNS验证(Route53会自动添加验证记录,无需手动操作)。证书签发后,推荐搭配ALB(应用负载均衡)使用:将ACM证书绑定到ALB的443端口,ALB转发流量到EC2的80端口,Nginx只需监听80端口即可,无需在EC2上部署证书。 - 若要直接在EC2部署,可使用Let's Encrypt的
certbot工具申请免费证书,工具会自动完成证书签发和Nginx配置。
2. 临时解决:信任自签名证书(仅本地测试用)
如果仅用于个人测试,可手动将mycert.crt导入浏览器的信任列表:
- 打开浏览器证书管理页面,找到“受信任的根证书颁发机构”,导入你的
mycert.crt文件。 - 注意:该方式仅对你的浏览器生效,其他用户访问仍会报错,不适合公网场景。
3. 检查Nginx配置正确性
- 确认证书文件路径
/path/to/certs/mycert.crt和/path/to/certs/mycert.key准确,且Nginx进程有读取权限:执行chmod 644 /path/to/certs/*和chown nginx:nginx /path/to/certs/*调整权限。 - 执行
nginx -t验证配置文件合法性,无语法错误后重启Nginx:systemctl restart nginx。
4. 诊断证书问题细节
用openssl命令查看证书状态,定位具体报错原因:
openssl s_client -connect test.mydomain.com:443
- 查看输出中的
Verify return code字段:- 若为
18 (self signed certificate):确认是自签名证书问题,按方向1解决。 - 若为
20 (unable to get local issuer certificate):说明缺少中间证书,需将中间证书追加到mycert.crt文件末尾。 - 若为
0 (ok)但浏览器仍报错:清除浏览器缓存后重试。
- 若为
内容的提问来源于stack exchange,提问作者RDV
相关产品推荐
相关产品推荐

