使用nginx-le构建带Let's Encrypt的Nginx镜像遇PEM证书错误求助
Hey,我之前用umputun/nginx-le搭建集成Let's Encrypt的Nginx镜像时,也踩过这个一模一样的坑!这个错误看起来是SSL证书读取失败,但本质问题其实很简单——你把证书路径指向了目录而不是具体的证书文件。
错误原因解析
错误提示里明确写了PEM_read_bio_X509_AUX("/etc/nginx/ssl/") failed,这里的/etc/nginx/ssl/是一个目录,而Nginx的ssl_certificate和ssl_certificate_key指令需要的是具体的PEM格式文件路径。当Nginx尝试读取目录作为证书时,自然无法解析出有效的证书内容,就会抛出"no start line: Expecting: TRUSTED CERTIFICATE"的错误。
修复步骤
1. 修正Nginx配置中的证书路径
打开你的Nginx配置文件(比如自定义的vhost配置或default.conf),找到SSL相关的配置段,确保ssl_certificate和ssl_certificate_key指向具体的证书文件:
server { listen 443 ssl; server_name your-domain.com; # 正确的证书路径,指向具体文件 ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; # 其他SSL配置... }
nginx-le容器默认会将Let's Encrypt生成的全链证书存为cert.pem,私钥存为key.pem,放在/etc/nginx/ssl/目录下。
2. 确认证书文件存在
如果是首次启动容器,可能Let's Encrypt还没完成证书颁发,这时候/etc/nginx/ssl/目录下可能没有有效证书。你可以先进入容器查看文件:
docker exec -it <你的容器名称或ID> ls -la /etc/nginx/ssl/
如果文件不存在,先让容器正常运行一段时间,等待它自动完成证书申请;或者可以先使用自签证书临时验证配置是否正确。
3. 重新加载Nginx配置
修正配置后,执行以下命令重新加载Nginx配置,无需重启容器:
docker exec -it <你的容器名称或ID> nginx -s reload
额外提示
如果你是通过环境变量配置nginx-le,要注意不要把证书路径类的变量(比如LETSENCRYPT_CERT_PATH)设为目录,保持默认值即可,容器会自动处理证书文件的路径。
内容的提问来源于stack exchange,提问作者Harshit Laddha

