| name | tls-audit |
| description | 用于检查授权目标的 TLS 配置、证书、协议版本、加密套件和常见 TLS 风险。适合用户提供域名、IP、端口、HTTPS URL 或服务清单时使用。会指导 testssl.sh、sslscan、openssl 的组合使用。 |
TLS 检查
这份技能提供 TLS 证书、身份、协议和套件的判断知识以及常用检查命令。根据当前问题选择快速确认或综合检查,不要求固定执行全部工具。
目标
检查 HTTPS/TLS 服务的:
- 证书有效期。
- 证书主体和 SAN。
- 主机名是否匹配。
- TLS/SSL 协议版本。
- 加密套件。
- 常见 TLS 配置风险。
- 证书链和签发机构信息。
适用输入
https://example.com
example.com:443
- IP 和端口。
- Web 服务列表。
- Nmap/httpx 发现的 HTTPS 服务。
开始前先判断
确认:
- 目标是否授权。
- 是否需要 SNI。
- 如果目标是 IP,应该用哪个域名做 SNI。
- 是否有非标准端口。
- 是否只是证书检查,还是完整 TLS 配置检查。
常见检查路径
证书身份、证书链、协议和密码套件是不同问题面。先确认连接目标与 SNI,再选择需要深入的部分,可以减少错误结论。
准备目标和 SNI 信息
mkdir -p tls/{input,raw,final,notes}
准备目标:
cat > tls/input/targets.txt <<'EOF'
example.com:443
EOF
快速确认证书和身份
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -fingerprint
如果是 IP,需要指定 SNI:
echo | openssl s_client -servername www.example.com -connect 203.0.113.10:443 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -fingerprint
验证证书链和主机名匹配:
openssl s_client \
-servername example.com \
-connect example.com:443 \
-verify_hostname example.com \
-verify_return_error \
< /dev/null > tls/raw/openssl_verify_example.com_443.txt 2>&1
快速枚举协议和套件
sslscan --show-certificate --no-colour example.com:443 \
| tee tls/raw/sslscan_example.com_443.txt
进行综合 TLS 检查
testssl.sh --jsonfile-pretty tls/raw/testssl_example.com_443.json example.com:443
如果输入是 URL:
testssl.sh --jsonfile-pretty tls/raw/testssl_example.json https://example.com
对目标列表批量检查
while read -r target; do
safe_name="$(echo "$target" | sed 's#[/:]#_#g')"
testssl.sh --jsonfile-pretty "tls/raw/testssl_${safe_name}.json" "$target" || true
sslscan --show-certificate --no-colour "$target" > "tls/raw/sslscan_${safe_name}.txt" || true
done < tls/input/targets.txt
理解检查结果
重点整理:
- 证书是否过期。
- 证书是否即将过期。
- 证书域名是否匹配。
- 是否支持 SSLv2、SSLv3、TLS 1.0、TLS 1.1。
- 是否存在弱套件。
- 是否支持不安全压缩或重协商。
- 是否有明显证书链问题。
工具使用要点
openssl s_client
适合手工确认证书和握手情况。
echo | openssl s_client -servername example.com -connect example.com:443
只看证书:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
要点:
- 测 HTTPS 域名时要带
-servername。
- IP 访问时尤其要注意 SNI。
- 使用
-verify_hostname 和 -verify_return_error 实际验证主机名及证书链。
sslscan
适合快速查看协议、套件和证书。
sslscan --show-certificate --no-colour example.com:443
要点:
- 输出直观,适合快速判断。
- 批量报告时保存原始文本。
testssl.sh
适合完整 TLS 检查。
testssl.sh --jsonfile-pretty testssl.json example.com:443
要点:
- JSON 输出便于整理。
- 检查项较多,运行时间比
sslscan 长。
- 不要重复无意义扫描同一目标。
值得保留的证据
- 实际连接的主机、IP、端口、SNI 和主机名验证目标。
- 证书主体、SAN、签发者、有效期和证书链验证结果。
- 已确认支持的协议版本、套件和相关配置风险。
- 因网络、SNI、客户端认证或中间设备而无法判断的部分。
TLS 结论应能说明问题属于身份验证、信任链、协议还是套件,并结合服务暴露方式判断实际影响。
判断与复核要点
- 证书问题、协议问题、套件问题要分开描述。
- 不能只写“TLS 不安全”,要说明具体证据。
- 对即将过期证书给出到期日期。
- 如果因为 SNI 或网络问题无法判断,要写清限制。