介绍
域名 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.pem2.进入容器校验 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