SSLyze 是 Kali Linux 中一款专业的 TLS/SSL 安全扫描工具,主要用于检测目标服务器的 TLS/SSL 配置安全性,包括协议版本支持、加密套件强度、证书有效性、常见漏洞(如 Heartbleed、ROBOT)等,广泛应用于渗透测试、服务器安全审计场景,帮助管理员发现 TLS/SSL 层面的安全风险并优化配置。
二、核心参数说明(中文对照)
2.1 位置参数(Positional Arguments)
| 参数 | 中文说明 | 使用场景 |
|---|---|---|
| target | 待扫描的服务器列表 | 指定单个或多个目标,格式为"主机名:端口"(端口默认443,可省略),如 sslyze example.com:8443 |
2.2 基础选项(Options)
| 参数 | 中文说明 | 使用场景 |
|---|---|---|
| -h, --help | 显示帮助信息并退出 | 首次使用时查看参数列表,如 sslyze -h |
| --custom_tls_config CUSTOM_TLS_CONFIG | 指定自定义TLS配置文件(JSON格式),需遵循Mozilla格式 | 需与特定TLS标准对比时使用,不可与 --mozilla_config 同时使用 |
| --mozilla_config {modern,intermediate,old,disable} | 按Mozilla推荐TLS配置扫描(默认intermediate),disable则关闭该检查 | 快速对齐行业标准,如 sslyze --mozilla_config modern example.com |
2.3 信任库选项(Trust Stores Options)
| 参数 | 中文说明 | 使用场景 |
|---|---|---|
| --update_trust_stores | 更新SSLyze默认信任库(从GitHub下载最新版本) | 单独使用,更新后其他参数会被忽略,确保证书验证准确性 |
2.4 客户端证书选项(Client Certificate Options)
| 参数 | 中文说明 | 使用场景 |
|---|---|---|
| --cert CERTIFICATE_FILE | 指定客户端证书链文件(PEM格式,需按"客户端证书→中间CA证书"排序) | 目标服务器要求客户端证书认证时,如 sslyze --cert client.crt --key client.key example.com |
| --key KEY_FILE | 指定客户端私钥文件 | 配合 --cert 使用,提供证书对应的私钥 |
| --keyform KEY_FORMAT | 指定客户端私钥格式(DER或PEM,默认PEM) | 私钥格式非默认时使用,如 sslyze --key key.der --keyform DER example.com |
| --pass PASSPHRASE | 指定客户端私钥的密码短语 | 私钥已加密时使用,避免手动输入密码,如 sslyze --key encrypted.key --pass 123456 example.com |
2.5 输入输出选项(Input and Output Options)
| 参数 | 中文说明 | 使用场景 |
|---|---|---|
| --json_out JSON_FILE | 将扫描结果以JSON格式写入文件(指定为"-"时输出到stdout) | 需后续分析或自动化处理结果时,如 sslyze --json_out result.json example.com |
| --targets_in TARGET_FILE | 从文件读取待扫描目标(每行一个"主机:端口") | 批量扫描多个目标,如 sslyze --targets_in targets.txt(targets.txt内每行格式:example1.com:443、example2.com:8443) |
| --quiet | 不向stdout输出任何内容(配合--json_out使用) |
静默扫描,仅保留JSON结果文件,如 sslyze --quiet --json_out result.json example.com |
2.6 连接选项(Connectivity Options)
| 参数 | 中文说明 | 使用场景 |
|---|---|---|
| --slow_connection | 大幅减少并发连接数,降低扫描速度但提高稳定性 | 网络缓慢或目标服务器并发能力弱时(避免超时/错误),如 sslyze --slow_connection example.com |
| --https_tunnel PROXY_SETTINGS | 通过HTTP CONNECT代理隧道连接目标(格式:http://用户:密码@代理主机:端口/) | 需通过代理扫描目标时,仅支持Basic认证,如 sslyze --https_tunnel http://user:pwd@proxy:8080 example.com |
| --starttls PROTOCOL | 对目标服务器执行StartTLS握手(支持协议:auto、smtp、xmpp、pop3等) | 扫描非HTTPS服务的TLS配置(如邮件、数据库),见下文"常见场景示例" |
| --xmpp_to HOSTNAME | STARTTLS XMPP的可选设置,指定XMPP流"to"属性的主机名(默认目标主机名) | XMPP服务StartTLS扫描需自定义"to"属性时,如 sslyze --starttls xmpp --xmpp_to chat.example.com xmpp.example.com |
| --sni SERVER_NAME_INDICATION | 使用SNI指定连接的主机名(仅影响TLS 1.0+连接) | 目标服务器使用虚拟主机(多域名共享IP)时,如 sslyze --sni site1.example.com example.com |
2.7 扫描命令选项(Scan Commands)
| 参数 | 中文说明 | 使用场景 |
|---|---|---|
| --tlsv1 / --tlsv1_1 / --tlsv1_2 / --tlsv1_3 | 测试目标服务器对TLS 1.0、1.1、1.2、1.3的支持情况 | 检测是否启用不安全的旧协议,如 sslyze --tlsv1 --tlsv1_3 example.com(同时检测TLS 1.0和1.3) |
| --sslv2 / --sslv3 | 测试目标服务器对SSL 2.0、3.0的支持情况(均为废弃不安全协议) | 排查极端老旧的不安全协议,如 sslyze --sslv3 example.com |
| --compression | 测试服务器是否支持TLS压缩(可能导致CRIME攻击) | 检测CRIME漏洞风险,如 sslyze --compression example.com |
| --certinfo | 获取并分析服务器证书,验证有效性(如过期时间、签发机构) | 审计证书安全性,如 sslyze --certinfo example.com |
| --certinfo_ca_file CERTINFO_CA_FILE | 配合--certinfo,指定用于验证证书的根CA文件(PEM格式) |
自定义CA环境下验证证书,如 sslyze --certinfo --certinfo_ca_file custom_ca.crt example.com |
| --ems | 测试服务器是否支持TLS扩展主密钥(Extended Master Secret) | 增强会话安全性,避免会话密钥泄露风险,如 sslyze --ems example.com |
| --elliptic_curves | 测试服务器支持的椭圆曲线(Elliptic Curves) | 检查是否使用弱椭圆曲线,如 sslyze --elliptic_curves example.com |
| --resum | 测试服务器TLS 1.2会话恢复支持(会话ID和TLS票据) | 评估会话复用效率,如 sslyze --resum example.com |
| --resum_attempts RESUM_ATTEMPTS | 配合--resum,指定会话恢复尝试次数(默认5次) |
提高会话恢复成功率统计准确性,如 sslyze --resum --resum_attempts 100 example.com |
| --early_data | 测试服务器是否支持TLS 1.3早期数据(0-RTT) | 评估TLS 1.3性能优化特性,如 sslyze --early_data example.com |
| --robot | 测试服务器是否存在ROBOT漏洞(可恢复RSA私钥) | 高危漏洞检测,如 sslyze --robot example.com |
| --openssl_ccs | 测试服务器是否存在OpenSSL CCS注入漏洞(CVE-2014-0224) | 老旧OpenSSL版本漏洞检测,如 sslyze --openssl_ccs example.com |
| --heartbleed | 测试服务器是否存在Heartbleed漏洞(CVE-2014-0160) | 经典漏洞检测,如 sslyze --heartbleed example.com |
| --http_headers | 测试服务器是否存在安全相关HTTP头(如HSTS、CSP) | 评估Web层安全防护,如 sslyze --http_headers example.com |
| --fallback | 测试服务器是否支持TLS_FALLBACK_SCSV机制(防止协议降级攻击) | 防御降级攻击检测,如 sslyze --fallback example.com |
| --reneg | 测试服务器是否支持不安全的TLS重协商和客户端发起的重协商 | 重协商漏洞检测,如 sslyze --reneg example.com |
三、SSLyze 完整使用教程(常见场景示例)
3.1 基础HTTPS服务扫描(默认443端口)
扫描目标HTTPS服务器的TLS协议版本、加密套件、证书信息(默认执行--mozilla_config intermediate):
sslyze example.com
说明:无需额外参数,直接指定目标域名/IP,默认扫描443端口,输出包含协议支持、证书有效性、Mozilla配置合规性等核心信息。
3.2 扫描自定义端口的HTTPS服务
若目标HTTPS服务使用非默认端口(如8443),需明确指定"主机:端口":
sslyze example.com:8443
3.3 检测特定TLS/SSL协议版本
仅检测目标是否支持TLS 1.0、TLS 1.3和SSL 3.0(排查老旧/不安全协议):
sslyze --tlsv1 --tlsv1_3 --sslv3 example.com
风险提示:SSL 2.0/3.0、TLS 1.0/1.1均为不安全/ deprecated协议,检测到支持需立即关闭。
3.4 扫描证书详细信息并验证有效性
获取证书链、签发机构、过期时间、SAN(Subject Alternative Name)等信息,并验证证书信任链:
sslyze --certinfo example.com
关键输出解读:关注"Certificate Validity"(是否过期)、"Trust"(是否被信任)、"Subject Alternative Name"(是否包含目标域名)。
3.5 检测常见高危漏洞(Heartbleed、ROBOT)
一次性检测Heartbleed(心脏出血)、ROBOT、OpenSSL CCS注入等经典漏洞:
sslyze --heartbleed --robot --openssl_ccs example.com
结果判断:输出中"VULNERABLE"表示存在漏洞,"NOT VULNERABLE"表示安全。
3.6 扫描非HTTPS服务的StartTLS配置
许多非HTTPS服务(如邮件、数据库)支持StartTLS(明文连接升级为TLS连接),需用--starttls指定协议:
-
扫描SMTP邮件服务器(25/587端口):
sslyze --starttls=smtp smtp.example.com:587 -
扫描IMAP邮件服务器(143端口):
sslyze --starttls=imap imap.example.com -
扫描POP3邮件服务器(110端口):
sslyze --starttls=pop3 pop3.example.com -
扫描LDAP服务器(389端口):
sslyze --starttls=ldap ldap.example.com -
扫描PostgreSQL数据库(5432端口):
sslyze --starttls=postgres db.example.com:5432 -
扫描FTP服务器(21端口):
sslyze --starttls=ftp ftp.example.com -
自动识别协议(按端口推测):
sslyze --starttls=auto example.com:587
3.7 批量扫描多个目标
当需要扫描大量目标时,将"主机:端口"按行写入文件(如targets.txt),通过--targets_in批量加载:
-
创建targets.txt文件,内容格式:
example.com:443 smtp.example.com:587 imap.example.com:143 db.example.com:5432 -
执行批量扫描:
sslyze --starttls=auto --targets_in targets.txt
优化建议 :批量扫描可配合--slow_connection(避免并发过高)和--json_out(保存结果),如:
sslyze --slow_connection --json_out batch_result.json --targets_in targets.txt
3.8 按Mozilla标准检测TLS配置合规性
Mozilla提供"Modern"(现代)、"Intermediate"(中等)、"Old"(老旧)三种TLS配置标准,SSLyze可直接对比:
-
按"Modern"标准扫描(仅支持TLS 1.2+,强加密套件):
sslyze --mozilla_config modern example.com -
按"Intermediate"标准扫描(兼容大部分客户端,默认选项):
sslyze --mozilla_config intermediate example.com
输出解读:"Mozilla TLS Configuration Check"部分会显示"COMPLIANT"(合规)或"NOT COMPLIANT"(不合规),并列出不合规项(如启用了TLS 1.0)。
3.9 生成JSON格式扫描报告(用于自动化分析)
将扫描结果输出为JSON文件,方便后续用脚本解析或导入其他工具:
sslyze --certinfo --heartbleed --json_out scan_result.json example.com
若需直接在终端查看JSON结果(不保存文件),可指定--json_out -:
sslyze --json_out - example.com
3.10 带客户端证书的扫描(目标需双向认证)
若目标服务器启用双向TLS认证(需客户端提供证书),需指定客户端证书、私钥(及密码,若加密):
sslyze --cert client.crt --key client.key --pass 123456 example.com
注意事项 :客户端证书需为PEM格式,且证书链顺序正确(客户端证书在前,中间CA在后);私钥格式默认PEM,若为DER需加--keyform DER。
3.11 通过HTTP代理扫描目标
若需通过代理访问目标(如内网环境),使用--https_tunnel指定代理信息(支持Basic认证):
sslyze --https_tunnel http://proxy_user:proxy_pwd@192.168.1.100:8080 example.com
代理要求:代理需支持HTTP CONNECT方法,否则无法建立TLS连接。
3.12 测试TLS会话恢复功能
会话恢复(会话ID/TLS票据)可减少握手开销,测试其支持情况及成功率:
sslyze --resum --resum_attempts 100 example.com
参数说明 :--resum_attempts 100表示尝试100次会话恢复,默认5次;输出会显示"Session ID Resumption Success Rate"和"TLS Ticket Resumption Success Rate"。
四、扫描结果关键指标解读
SSLyze输出内容较多,核心关注以下指标,快速判断目标TLS/SSL安全性:
| 指标类别 | 安全标准 | 风险点 |
|---|---|---|
| 协议版本 | 仅支持TLS 1.2、TLS 1.3 | 支持SSL 2.0/3.0、TLS 1.0/1.1 |
| 加密套件 | 使用AEAD套件(如TLS_AES_256_GCM_SHA384、TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) | 使用RC4、3DES、SHA-1等弱套件/哈希算法 |
| 证书信息 | 证书未过期、被信任CA签发、SAN包含目标域名、密钥长度≥2048位(RSA)/≥256位(ECC) | 证书过期、自签证书、SAN不匹配、密钥长度<2048位 |
| 漏洞检测 | Heartbleed、ROBOT、OpenSSL CCS等漏洞均为"NOT VULNERABLE" | 任何漏洞显示"VULNERABLE" |
| 扩展特性 | 支持EMS(扩展主密钥)、TLS_FALLBACK_SCSV(防降级)、OCSP Stapling(证书状态验证) | 支持TLS压缩(CRIME风险)、不支持SNI(多域名部署问题) |
五、常见问题与解决方法
- 问题1:扫描时频繁超时/报错
解决:添加--slow_connection减少并发连接,或检查目标端口是否开放、网络是否可达。 - 问题2:证书验证显示"UNTRUSTED"
解决:若目标使用自签证书或私有CA,需用--certinfo_ca_file指定自定义CA文件;若为公网服务,需确认证书是否由正规CA签发。 - 问题3:StartTLS扫描失败(提示"Protocol not supported")
解决:确认目标服务是否真的支持StartTLS(如部分FTP服务器仅支持FTPS,不支持StartTLS),或检查--starttls指定的协议是否正确(如SMTP对应smtp,而非imap)。 - 问题4:无法通过代理扫描
解决:确认代理支持HTTP CONNECT方法,且认证信息(用户名/密码)正确;若代理端口非默认,需明确指定(如http://user:pwd@proxy:8080。