HSTS导致无法访问且无“继续访问”选项,是因为浏览器在TLS握手前强制拦截:先查chrome://net-internals/#hsts确认是否Found,再用openssl验证证书notAfter时间,curl检查Strict-Transport-Security头是否仍存在,需设max-age=0并重载Nginx,最后手动Delete域名缓存并用无痕窗口验证。

开启 HSTS 后证书到期,用户连“高级”→“继续访问(不安全)”的绕过选项都看不到,是因为浏览器已强制拦截 HTTP 请求,且对 HTTPS 请求直接拒绝建立 TLS 连接——根本不会把请求发到 Nginx。这不是 Nginx 拒绝服务,而是客户端在握手前就终止了流程。
确认浏览器是否已启用 HSTS 策略
打开 Chrome 或 Edge,地址栏输入:
chrome://net-internals/#hsts
在 “Query domain” 输入你的域名(如 test.example.com),点击 Query。
若返回 Found,说明该域名已被浏览器记录,max-age 值即为强制 HTTPS 的剩余时长;若显示 Not found,问题不在 HSTS,需转向证书或网络层排查。
验证当前证书是否真的过期
别依赖浏览器提示,用命令直查服务端真实状态:
openssl x509 -in /etc/nginx/ssl/fullchain.pem -noout -dates
重点看 notAfter 时间是否早于当前时间(2026年9月16日)。
同时确认 Nginx 配置中路径正确:
grep -E "ssl_certificate|ssl_certificate_key" /etc/nginx/sites-enabled/*
再检查文件是否存在、权限是否为 644、属主是否可读(如 root:root)。
检查响应头是否仍在发送 HSTS
即使证书已过期,只要 Nginx 还在返回 Strict-Transport-Security 头,浏览器就会持续执行策略:
curl -I https://test.example.com 2>&1 | grep -i "strict-transport-security"
如果输出非空,说明服务端仍在“喂”策略。此时需立即修改配置:
- 将 add_header Strict-Transport-Security "max-age=0; includeSubDomains"; 写入 server 块
- 执行 sudo nginx -t && sudo nginx -s reload
注意:仅删掉该行不够,必须显式设 max-age=0 才能触发浏览器清除缓存。
手动清理客户端 HSTS 缓存并验证
服务端改完只是第一步,用户本地缓存仍生效:
回到 chrome://net-internals/#hsts
在 “Delete domain security policies” 区域输入域名,点击 Delete。
然后开一个无痕窗口访问 https://test.example.com,观察是否仍跳转或报错。
若无痕窗口可正常显示证书警告页(含“继续前往…”按钮),说明 HSTS 已解除;若仍直接报 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 等底层错误,则问题在证书链、协议兼容性或系统时间偏差。











