企业级Nginx TLS安全自查脚本需覆盖证书链完整性、TLS协议版本、强密码套件、安全响应头及HSTS预加载五项核心检测,并支持批量扫描、结果归档与CI/CD集成,实现自动化闭环加固。

企业级 Nginx TLS 安全配置不能只靠人工检查,尤其在多站点、多环境、频繁变更的运维场景下。一个可靠的自查脚本需覆盖证书链完整性、协议与密码套件合规性、安全响应头缺失、HSTS 策略启用状态等核心维度,并支持批量扫描与结果归档。
关键检测项与对应实现逻辑
脚本应分层验证,避免“能连上 HTTPS 就算合格”的误区:
-
证书链有效性:用
openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null提取完整证书链,再通过openssl verify -CAfile fullchain.pem cert.pem验证是否可被系统信任;返回 code 0 才代表中间证书已正确拼接 -
TLS 协议版本强制性:检查 Nginx 配置中是否存在
ssl_protocols TLSv1.2 TLSv1.3;,且无TLSv1.0或TLSv1.1;同时用openssl s_client -tls1_1 -connect example.com:443实际探测是否拒绝连接 -
强密码套件启用:提取
ssl_ciphers值,正则匹配是否包含ECDHE、AES256-GCM、CHACHA20等关键词,排除RC4、MD5、aNULL等禁用项 -
安全响应头存在性:用
curl -I https://example.com | grep -i -E "strict-transport-security|content-security-policy|x-content-type-options"检查三项是否全部返回;缺失任一即标为高风险 -
HSTS 预加载就绪性(如需入 Chrome 预加载列表):确认响应头含
max-age=31536000; includeSubDomains; preload,且域名已通过 hstspreload.org 提交校验
推荐的 Bash 自查脚本结构
以下为轻量、可直接部署的 nginx_tls_check.sh 核心骨架(支持单站快速跑、多域名批量执行):
#!/bin/bash
DOMAINS=("example.com" "api.example.com")
for domain in "${DOMAINS[@]}"; do
echo "=== 检测 $domain ==="
<h1>证书链验证</h1><p>if openssl s_client -connect "$domain:443" -servername "$domain" 2>/dev/null | \
openssl x509 -noout -text 2>/dev/null | grep -q "CA Issuers"; then
echo "✅ 证书链完整"
else
echo "❌ 证书链不完整(Verify return code 20)"
fi</p><h1>TLS 1.2+ 实际握手测试</h1><p>if timeout 5 openssl s_client -tls1_2 -connect "$domain:443" -servername "$domain" 2>/dev/null | grep -q "Verification OK"; then
echo "✅ TLS 1.2 握手成功"
else
echo "❌ TLS 1.2 被拒绝或超时"
fi</p><h1>安全响应头检查</h1><p>HEADERS=$(curl -sI "<a href="https://www.php.cn/link/4e51d8e535084ebd3e6b0dad11057df6">https://www.php.cn/link/4e51d8e535084ebd3e6b0dad11057df6</a>" | tr '[:lower:]' '[:upper:]')
[ $(echo "$HEADERS" | grep -c "STRICT-TRANSPORT-SECURITY:") ] && hsts=1 || hsts=0
[ $(echo "$HEADERS" | grep -c "CONTENT-SECURITY-POLICY:") ] && csp=1 || csp=0
[ $(echo "$HEADERS" | grep -c "X-CONTENT-TYPE-OPTIONS:") ] && xcto=1 || xcto=0
if [ $hsts -eq 1 ] && [ $csp -eq 1 ] && [ $xcto -eq 1 ]; then
echo "✅ 全部安全响应头已启用"
else
echo "❌ 缺失响应头:$( [ $hsts -eq 0 ] && echo "HSTS" ) $( [ $csp -eq 0 ] && echo "CSP" ) $( [ $xcto -eq 0 ] && echo "X-Content-Type-Options" )"
fi
done
自动化集成建议
让检测真正落地,不是只跑一次:
-
CI/CD 流水线嵌入:在站点发布前触发该脚本,失败则阻断部署(例如 GitLab CI 中添加
before_script) -
定时巡检 + 邮件告警:用
cron每日凌晨执行,异常结果写入/var/log/nginx-tls-check.log并通过mail或企业微信机器人推送 -
对接 CMDB 或资产平台:脚本输出 JSON 格式(可用
jq处理),供统一安全态势看板消费 -
规避误报增强:对 CDN 或 WAF 后端真实 Nginx,需确保
curl请求直连源站 IP(加--resolve domain:443:10.0.1.100),避免检测到边缘节点配置
配套加固动作清单
检测只是起点,发现即修是闭环关键。脚本可附带一键修复建议(非自动改配置,而是输出明确指令):
- 若证书链不完整:提示运行
cat example.com.crt intermediate.pem > fullchain.pem并更新 Nginx 的ssl_certificate - 若缺少 HSTS:给出标准配置行
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 若 TLS 版本过旧:定位配置文件行号,提示替换
ssl_protocols值并 reload - 若响应头缺失:汇总缺失项,生成可粘贴的
add_header块模板


















