背景
过去 10 年处理过多起因证书过期 / 弱密钥 / 证书链不完整导致的生产事故。多数团队对证书生命周期缺乏系统化的自动巡检手段,往往依赖「人工到期提醒 + 手动续签」,一旦漏检就是全链路中断。
最终要什么
一个 Bash 巡检脚本(单文件,Bash 4+ 兼容),对指定主机 / 端口列表执行 TLS 证书与密钥安全审计,输出结构化 JSON 报告(stdout),退出码反映是否存在 CRITICAL 级问题。
输入与上下文
- 输入:
targets.txt(每行host:port,支持 IPv4/IPv6/域名,≥1 行) - 环境:Linux(RHEL 9 / Ubuntu 22.04 均可),依赖
openssl、jq(date用于到期计算) - 脚本需可重复执行、无副作用(只读审计,不修改任何服务端配置)
覆盖的 5 个典型风险场景
- 证书即将过期:剩余有效期 < 30 天 → WARN;< 7 天 → CRITICAL;已过期 → CRITICAL
- 弱签名算法:检测证书签名使用 MD5 / SHA1,或 RSA 密钥长度 < 2048 → CRITICAL
- 证书链不完整:服务端未提供中间 CA 证书(
openssl s_client -show_certificates链长 < 2)→ WARN - HSTS 缺失或配置不当:HTTPS 响应缺少
Strict-Transport-Security头,或max-age < 31536000/ 缺少includeSubDomains→ WARN - 证书与私钥不匹配(可选,需服务端配合):通过
openssl s_client比对subject与issuer,辅助判断自签名 / 证书不匹配 → WARN
交付格式
- 单文件 Bash 脚本(
tls_audit.sh),含--help用法说明 - JSON 报告结构(stdout,
jq可解析):{ "timestamp": "ISO-8601", "targets": [ { "host": "example.com", "port": 443, "checks": [ {"name": "cert_expiry", "status": "PASS|WARN|CRITICAL", "detail": "..."}, {"name": "weak_algo", "status": "PASS", "detail": "RSA-3072/SHA256"} ], "summary": "PASS|WARN|CRITICAL" } ], "overall": "PASS|WARN|CRITICAL" } - README.md:安装依赖、使用示例、各场景说明、退出码约定(0=全 PASS,1=有 WARN,2=有 CRITICAL)
- 测试用例:至少 3 组(含一个正常证书、一个自签名、一个弱算法),附
test_run.sh
0赞
0收藏
0评论
1浏览