0

curl检查Strict-Transport-Security max-age值命令:5个实战技巧精准诊断HSTS配置

2026.06.03 | youres | 28次围观

为什么要用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个层次:

  1. curl -sI + grep:快速查看HSTS响应头
  2. curl -sI + grep -oP:精确提取max-age数值
  3. curl -vI:查看完整协商过程排查问题
  4. 逐项检查includeSubDomains和preload指令
  5. 批量脚本检测多域名HSTS合规性

定期用curl检查HSTS配置,是网站安全运维的基本功。max-age值设置得当,既保障安全又不给自己挖坑。

相关阅读:

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论