Skip to content

介绍 ​

域名 www.yquest.cn 浏览器访问提示 HTTPS 证书不安全、证书过期。 使用openssl s_client命令行测试服务器,发现证书已经被 certbot 更新,但浏览器依旧拿到过期证书。

原因 ​

Certbot 会自动把新证书生成到宿主机目录 /etc/letsencrypt/live/www.yquest.cn/。 Nginx 运行在 Docker 容器中,业务实际读取的证书文件是宿主机挂载目录 /home/nginx/conf/ssl。 Certbot 原生不会自动复制证书到 Docker 挂载目录,也不会重载 Docker 内部 Nginx。 虽然系统内证书已经更新,但容器 Nginx 依旧读取旧证书文件,对外暴露过期证书。 浏览器端还可能存在 SSL 会话缓存,即使服务端修复,浏览器依然展示不安全标记。

1.将 certbot 目录下已更新的证书复制到 Docker 挂载的宿主机 ssl 目录 ​

bash
cp /etc/letsencrypt/live/www.yquest.cn/fullchain.pem /home/nginx/conf/ssl/fullchain.pem
cp /etc/letsencrypt/live/www.yquest.cn/privkey.pem /home/nginx/conf/ssl/privkey.pem

2.进入容器校验 Nginx 配置语法,重载 Nginx 使新证书生效 ​

bash
#校验配置
docker exec nginx nginx -t
#重载nginx,不重启容器
docker exec nginx nginx -s reload

配置自动续期钩子(彻底解决,后续无需手动操作) ​

bash
#创建目录,-p不存在就新建
mkdir -p /etc/letsencrypt/renewal‑hooks/post

#写入脚本
cat > /etc/letsencrypt/renewal‑hooks/post/copy_ssl_cert.sh <<'EOF'
#!/bin/bash
SSL_TARGET="/home/nginx/conf/ssl"
DOMAIN="www.yquest.cn"

cp /etc/letsencrypt/live/${DOMAIN}/fullchain.pem ${SSL_TARGET}/fullchain.pem
cp /etc/letsencrypt/live/${DOMAIN}/privkey.pem ${SSL_TARGET}/privkey.pem

docker exec nginx nginx -s reload
EOF

#赋予执行权限
chmod +x /etc/letsencrypt/renewal‑hooks/post/copy_ssl_cert.sh

#测试脚本跑一遍
bash /etc/letsencrypt/renewal‑hooks/post/copy_ssl_cert.sh

测试域名: ​

bash
openssl s_client -connect www.yquest.cn:443

上次更新于: