测试时把 Strict-Transport-Security 写成 max-age=63072000; includeSubDomains,证书到期未续,Chrome 和蜘蛛都直接报 NET::ERR_CERT_DATE_INVALID,连降级到 http 的入口都没有。
原因不止一个,得分开看。HSTS 的 max-age 在客户端缓存,服务端改配置无法立即撤回。还有一种是includeSubDomains 把测试子域也一起锁死,子域的自签证书全被拒。
不容易想到的是,没有 preload 提交记录,说明问题出在本域策略而不是浏览器内置列表。
上来先看响应头里的实际策略值
curl -sI https://www.example.com | grep -i strict-transport
再往下把期限降到一天并去掉子域
add_header Strict-Transport-Security "max-age=86400" always;
证书续签后用脚本确认到期时间
openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null 2>/dev/null | openssl x509 -noout -dates
这类改动我都写进变更记录,过两周再出问题时能对上号。
改完先别撤,确认这几项。证书 notAfter 回到一年后,Chrome 访问不再出现日期无效提示,响应头里的 max-age 已经降到设定值,蜘蛛抓取恢复 200。
提醒一点。上线前先用短期限跑一周,确认续签链路没问题再拉长,否则一次证书事故会让用户在有效期内都进不来。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
