testssl.sh配置文件详解:自定义扫描行为的方法
痛点与解决方案
你是否在使用testssl.sh时遇到扫描结果不符合需求的情况?是否需要针对特定业务场景定制TLS扫描规则?本文将系统讲解testssl.sh配置文件体系,通过15个实战案例演示如何自定义扫描行为,从根本上解决扫描策略僵化问题。
读完本文你将掌握:
- 三大核心配置文件的工作原理
- 自定义加密套件优先级排序的方法
- 客户端模拟测试环境的精准配置
- 证书信任链验证规则的高级定制
- 扫描性能与准确性的平衡调优
配置文件体系架构
testssl.sh的配置系统采用模块化设计,主要配置文件位于项目根目录的etc/文件夹下,形成"核心配置+扩展规则"的双层架构。
配置文件功能矩阵
| 文件名 | 主要功能 | 数据格式 | 典型应用场景 |
|---|---|---|---|
| openssl.cnf | OpenSSL引擎配置 | INI格式 | 自定义SSL上下文参数 |
| cipher-mapping.txt | 加密套件映射表 | 空格分隔文本 | 调整套件优先级排序 |
| client-simulation.txt | 客户端行为模板 | Bash数组 | 模拟特定浏览器/设备 |
| ca_hashes.txt | 可信CA指纹库 | 哈希列表 | 证书链验证规则定制 |
| curves.txt | ECC曲线优先级 | 名称列表 | 椭圆曲线支持配置 |
核心配置文件详解
openssl.cnf:SSL引擎配置中心
该文件是testssl.sh与OpenSSL引擎交互的核心配置接口,采用标准INI格式,包含多个功能区块。其中对扫描行为影响最大的是[req]和[ssl_server]区块。
关键配置参数
[req]
default_bits = 2048 ; 默认密钥长度
distinguished_name = req_distinguished_name
x509_extensions = v3_ca ; 默认扩展配置
string_mask = utf8only ; 字符串编码限制
[ssl_server]
ssl_protocols = TLSv1.2 TLSv1.3 ; 启用的协议版本
cipher_suite = HIGH:!aNULL:!MD5 ; 加密套件选择策略
实用配置示例:禁用弱哈希算法
要全局禁用所有MD5和SHA1相关的哈希算法,可修改[req]区块的默认消息摘要算法:
[req]
default_md = sha256 ; 默认使用SHA-256
[ssl_client]
ssl_cipher = HIGH:!MD5:!SHA1 ; 禁用MD5和SHA1
cipher-mapping.txt:加密套件定义库
该文件定义了IANA标准加密套件与OpenSSL名称之间的映射关系,同时包含加密强度评级信息。每行代表一个加密套件,包含6个字段:
0x13,0x02 - TLS_AES_256_GCM_SHA384 TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
字段解析:
- 十六进制标识符:用于TLS握手时的套件协商
- OpenSSL名称:OpenSSL库使用的套件标识符
- IANA标准名称:TLS协议标准名称
- 支持的协议版本:如TLSv1.2、TLSv1.3等
- 密钥交换算法(Kx):如ECDH、RSA、PSK等
- 认证算法(Au):如ECDSA、RSA等
- 加密算法(Enc):如AESGCM(256)、ChaCha20等
- 消息认证码(Mac):如AEAD、SHA384等
自定义套件优先级
通过调整文件中套件的顺序,可影响testssl.sh的套件优先级评估。例如,将ChaCha20套件移至AES套件之前:
-0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
+0xCC,0xA8 - ECDHE-RSA-CHACHA20-POLY1305 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=ChaCha20(256) Mac=AEAD
client-simulation.txt:客户端行为模拟
该文件定义了各种客户端(浏览器、操作系统、移动设备)的TLS握手行为模板,用于模拟真实-world客户端的连接测试。每个客户端配置包含以下关键参数:
names+=("Android 13/14 (native)")
short+=("android_13_14")
ch_ciphers+=("ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:...")
ciphersuites+=("TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:...")
ch_sni+=("$SNI")
handshakebytes+=("16030102330100022f0303564593a940b5d751d4cee7d4cd3ffbb68c...")
protos+=("-no_ssl3 -no_ssl2")
tlsvers+=("-tls1_3 -tls1_2")
alpn+=("http/1.1")
curves+=("x25519:secp256r1:secp384r1")
客户端配置参数详解
| 参数名 | 含义 | 示例值 |
|---|---|---|
| names | 客户端名称 | "Android 13/14 (native)" |
| short | 短标识符 | "android_13_14" |
| ch_ciphers | 密码套件列表 | "ECDHE-ECDSA-AES128-GCM-SHA256:..." |
| ciphersuites | TLS 1.3密码套件 | "TLS_AES_128_GCM_SHA256:..." |
| ch_sni | SNI配置 | "$SNI" |
| handshakebytes | 握手报文模板 | "16030102330100022f030356..." |
| protos | 禁用协议 | "-no_ssl3 -no_ssl2" |
| tlsvers | 启用协议 | "-tls1_3 -tls1_2" |
| alpn | ALPN扩展 | "http/1.1" |
| curves | 椭圆曲线列表 | "x25519:secp256r1:secp384r1" |
高级配置实战
场景一:企业内部加密标准合规检测
某金融机构需要确保所有服务器仅支持FIPS 140-2认可的加密套件,可通过以下步骤配置:
- 定制加密套件白名单
创建etc/fips-ciphers.txt文件,定义允许的套件:
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-CHACHA20-POLY1305
DHE-RSA-AES256-GCM-SHA384
- 修改cipher-mapping.txt
使用utils/hexstream2cipher.sh工具生成映射关系:
./utils/hexstream2cipher.sh fips-ciphers.txt >> etc/cipher-mapping.txt
- 配置优先级规则
在openssl.cnf中设置:
[ssl_client]
cipher_suite = @SECLEVEL=2:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:...
- 执行合规扫描
./testssl.sh --cipher-list fips-ciphers.txt --openssl-config etc/openssl.cnf example.com
场景二:模拟老旧客户端兼容性测试
要测试服务器对Android 4.4 (KitKat)设备的兼容性,需精确配置客户端模拟参数:
- 查找客户端配置段
在client-simulation.txt中找到Android 4.4.2配置:
names+=("Android 4.4.2")
short+=("android_442")
ch_ciphers+=("ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:...")
...
- 调整加密套件顺序
将AES-CBC套件提前,适应老旧设备需求:
-ch_ciphers+=("ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:...")
+ch_ciphers+=("ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES256-SHA:...")
- 限制TLS版本
-protos+=("-no_ssl2")
+tlsvers+=("-tls1 -tls1_1")
+protos+=("-no_ssl2 -no_tls1_2 -no_tls1_3")
- 执行模拟测试
./testssl.sh --client-simulation android_442 --sneaky example.com
场景三:证书信任链验证规则定制
企业内部CA签发的证书需要被testssl.sh识别为可信,需配置ca_hashes.txt:
- 提取CA证书哈希
openssl x509 -in internal-ca.crt -noout -fingerprint -sha256 | awk -F= '{print $2}' | tr -d ':' | awk '{print tolower($0) " internal-ca"}' >> etc/ca_hashes.txt
- 配置证书验证规则
在openssl.cnf中添加:
[ca]
default_ca = custom_ca
[custom_ca]
dir = ./etc/ca
certs = $dir/certs
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/cacert.pem
serial = $dir/serial
crl_dir = $dir/crl
crl = $dir/crl.pem
- 执行信任链验证
./testssl.sh --capath etc/ca --show-cert example.com
性能优化配置
对于大型网络扫描任务,合理调整配置可显著提升性能:
关键性能参数
| 参数 | 配置位置 | 推荐值 | 影响 |
|---|---|---|---|
| Max Concurrent Connections | testssl.sh | 5-10 | 并发连接数 |
| Session Cache Size | openssl.cnf | 1000 | 会话缓存大小 |
| Timeout | testssl.sh | 15s | 连接超时时间 |
| Retry Count | testssl.sh | 2 | 重试次数 |
性能优化配置示例
修改testssl.sh脚本中的默认参数:
# 原始配置
MAX_PARALLEL=3
SSL_TIMEOUT=10
# 优化配置
MAX_PARALLEL=8
SSL_TIMEOUT=15
配置文件维护与更新
testssl.sh项目会定期更新配置文件以支持新的TLS特性和安全标准,建议通过以下工作流维护配置文件:
自动化更新脚本
创建update-configs.sh:
#!/bin/bash
# 同步最新的CA哈希
wget -O etc/ca_hashes.txt https://testssl.sh/ca_hashes.txt
# 更新加密套件映射
./utils/generate_static_cipher_lists.sh > etc/cipher-mapping.txt
# 验证配置文件完整性
./utils/checkcert.sh etc/
常见问题与解决方案
Q1: 修改配置后扫描结果无变化?
A1: 检查以下可能原因:
- 配置文件路径是否正确(必须在
etc/目录下) - 是否使用了
--openssl-config参数指定自定义配置 - 配置文件权限是否允许读取
- 重启终端或执行
source ~/.bashrc刷新环境
Q2: 如何验证客户端模拟配置是否生效?
A2: 使用--debug 3参数查看详细握手过程:
./testssl.sh --client-simulation android_13_14 --debug 3 example.com | grep "ClientHello"
Q3: 自定义加密套件排序不生效?
A3: 确认:
- cipher-mapping.txt中的套件顺序是否正确
- 未使用
--cipher-list参数覆盖配置 - OpenSSL版本支持指定的套件(
openssl ciphers -v验证)
总结与进阶方向
本文详细介绍了testssl.sh配置文件系统的架构和核心功能,通过实际场景演示了如何定制加密套件、客户端模拟和证书验证规则。高级用户可进一步探索:
- 动态配置生成:使用脚本根据环境变量自动生成配置文件
- 配置模板系统:为不同场景创建配置文件模板(PCI-DSS、HIPAA等)
- 配置版本控制:将关键配置文件纳入Git管理,追踪变更历史
- 自定义扫描模块:开发基于Lua的扩展规则脚本
testssl.sh的配置系统设计兼顾了灵活性和易用性,通过合理配置可满足从简单扫描到复杂合规检测的各种需求。建议定期查看项目的Coding_Convention.md文档,了解配置文件格式的最新规范。
下一步行动建议
- 基础配置:备份默认配置文件,创建个人配置目录
- 安全加固:禁用不安全的加密套件和协议版本
- 场景测试:为关键业务场景创建专用配置文件
- 自动化集成:将配置管理纳入CI/CD流程
通过系统掌握testssl.sh的配置能力,您可以构建更贴合实际需求的TLS安全扫描解决方案,在保障系统安全的同时确保业务兼容性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



