为什么要用curl检查HSTS max-age值
HSTS(HTTP Strict Transport Security)是网站安全的重要防线,而max-age值决定了浏览器在多长时间内强制使用HTTPS访问你的站点。max-age设得太短,安全效果打折;设得太长,配置出错后难以撤销。用curl检查Strict-Transport-Security头的max-age值,是最直接、最快速的验证手段——无需打开浏览器,一条命令就能确认HSTS是否正确配置。
一、curl -sI:最基础的HSTS响应头检查
这是最简单的方式,只看响应头,不下载页面内容:
curl -sI https://www.example.com | grep -i strict
输出类似:
strict-transport-security: max-age=31536000; includeSubDomains; preload
参数说明:
-s:静默模式,不显示进度条-I:只请求响应头(HEAD请求)grep -i strict:忽略大小写过滤HSTS相关行
如果没有任何输出,说明该网站没有配置HSTS,这是一个安全隐患。
二、curl -sI + awk:精确提取max-age数值
只看完整的响应头信息量太大,用awk直接提取max-age的数值:
curl -sI https://www.example.com | grep -i strict-transport-security | grep -oP 'max-age=\K[0-9]+'
输出就是纯数字,比如 31536000(即一年,单位秒)。
如果你用的是macOS,grep没有-P参数,可以用awk替代:
curl -sI https://www.example.com | awk '/strict-transport-security/{match($0, /max-age=([0-9]+)/, arr); print arr[1]}'
max-age常见参考值
- 0:立即取消HSTS(用于紧急撤销)
- 300:5分钟,仅用于测试
- 15552000:约6个月,HSTS preload最低要求
- 31536000:1年,生产环境推荐值
- 63072000:2年,HSTS preload提交的推荐值
三、curl -vI:查看完整的HSTS协商过程
有时候HSTS配置不生效,需要看更详细的请求过程:
curl -vI https://www.example.com 2>&1 | grep -i strict
-v参数会输出完整的SSL握手和请求过程,能帮你发现:
- SSL证书是否有效(证书无效时HSTS不生效)
- 是否存在HTTP到HTTPS的跳转(HSTS只在HTTPS响应中有效)
- 响应头中HSTS是否被CDN层删除
四、curl检测includeSubDomains和preload指令
max-age值只是HSTS配置的一部分,还要检查另外两个关键指令:
curl -sI https://www.example.com | grep -i strict-transport-security
完整的HSTS响应头应该包含三个指令:
strict-transport-security: max-age=31536000; includeSubDomains; preload
逐项检查要点:
- includeSubDomains:确保所有子域名也强制HTTPS。缺少此指令,子域名可能走HTTP。
- preload:表示同意加入浏览器预加载列表。提交到hstspreload.org时必须包含。
快速检查脚本:
#!/bin/bash
DOMAIN=$1
HEADER=$(curl -sI https://$DOMAIN | grep -i strict-transport-security)
[ -z "$HEADER" ] && echo "⚠ HSTS未配置" && exit 1
echo "$HEADER" | grep -qi "max-age" && echo "✅ max-age已配置" || echo "❌ 缺少max-age"
echo "$HEADER" | grep -qi "includeSubDomains" && echo "✅ includeSubDomains已配置" || echo "⚠ 缺少includeSubDomains"
echo "$HEADER" | grep -qi "preload" && echo "✅ preload已配置" || echo "⚠ 缺少preload"
五、批量检测多个域名的HSTS max-age
运维场景下需要同时检查多个域名的HSTS配置:
#!/bin/bash
# hsts-check.sh - 批量HSTS检测脚本
DOMAINS=("example.com" "www.example.com" "api.example.com")
for domain in "${DOMAINS[@]}"; do
hsts=$(curl -sI -m 5 https://$domain | grep -i strict-transport-security)
if [ -z "$hsts" ]; then
echo "$domain: ❌ HSTS未配置"
else
maxage=$(echo "$hsts" | grep -oP 'max-age=\K[0-9]+')
if [ "$maxage" -ge 31536000 ] 2>/dev/null; then
echo "$domain: ✅ max-age=${maxage}秒 (合规)"
else
echo "$domain: ⚠ max-age=${maxage}秒 (建议≥31536000)"
fi
fi
done
脚本会逐个检测每个域名,输出HSTS配置状态和max-age是否合规。
常见问题排查
curl看不到Strict-Transport-Security头
可能原因:
- 用HTTP而不是HTTPS请求(HSTS只在HTTPS响应中出现)
- CDN层删除了HSTS头(检查CDN配置)
- Nginx add_header缺少always参数(导致非200响应丢失HSTS头)
- HSTS只在第一次HTTPS访问后生效,不是服务端302跳转
max-age值和Nginx配置不一致
检查是否有多个add_header指令互相覆盖。Nginx中子location的add_header会完全替换父级的add_header,而不是追加。确保每个location块都配置了HSTS头,或使用headers-more模块统一设置。
总结
用curl检查HSTS的max-age值,从简单到完整有5个层次:
curl -sI + grep:快速查看HSTS响应头curl -sI + grep -oP:精确提取max-age数值curl -vI:查看完整协商过程排查问题- 逐项检查includeSubDomains和preload指令
- 批量脚本检测多域名HSTS合规性
定期用curl检查HSTS配置,是网站安全运维的基本功。max-age值设置得当,既保障安全又不给自己挖坑。
相关阅读:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论