在安全审计和服务器配置中,检测 TLS 版本支持是重要的一环。本文介绍使用 OpenSSL 命令行工具检测目标服务器支持的 TLS 协议版本。

基本检测方法

检测特定 TLS 版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 检测 TLS 1.2
openssl s_client -connect example.com:443 -tls1_2 </dev/null

# 检测 TLS 1.3
openssl s_client -connect example.com:443 -tls1_3 </dev/null

# 检测 TLS 1.1(已不安全)
openssl s_client -connect example.com:443 -tls1_1 </dev/null

# 检测 TLS 1.0(已不安全)
openssl s_client -connect example.com:443 -tls1 </dev/null

判断是否支持

连接成功后会显示协议和加密套件:

1
2
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
    Protocol  : TLSv1.2

如果不支持,会显示错误或 Cipher is (NONE)

快速检测脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
# check_tls.sh - 检测服务器 TLS 版本支持

HOST=${1:-"example.com"}
PORT=${2:-"443"}

echo "检测 $HOST:$PORT 的 TLS 版本支持..."
echo

for ver in tls1 tls1_1 tls1_2 tls1_3; do
    result=$(echo "Q" | timeout 5 openssl s_client -connect "$HOST:$PORT" -$ver 2>/dev/null | grep "Protocol")
    
    if echo "$result" | grep -q "TLSv"; then
        protocol=$(echo "$result" | awk '{print $3}')
        cipher=$(echo "Q" | timeout 5 openssl s_client -connect "$HOST:$PORT" -$ver 2>/dev/null | grep "Cipher is" | awk '{print $5}')
        echo "✓ $ver 支持 ($protocol, $cipher)"
    else
        echo "✗ $ver 不支持"
    fi
done

使用方法:

1
2
chmod +x check_tls.sh
./check_tls.sh www.baidu.com 443

检测示例

1
2
3
4
5
6
# 检测百度
echo "Q" | openssl s_client -connect www.baidu.com:443 -tls1_2 2>/dev/null | grep -E "Protocol|Cipher"
# 输出: Protocol  : TLSv1.2

# 检测本地服务
echo "Q" | openssl s_client -connect localhost:8443 -tls1_3 2>/dev/null | grep -E "Protocol|Cipher"

OpenSSL 支持的协议选项

查看本地 OpenSSL 支持哪些协议:

1
openssl s_client -help 2>&1 | grep -E "^\s+-tls"

典型输出:

1
2
3
4
 -tls1                      Just use TLSv1
 -tls1_1                    Just use TLSv1.1
 -tls1_2                    Just use TLSv1.2
 -tls1_3                    Just use TLSv1.3

指定 SNI(Server Name Indication)

对于使用 SNI 的服务器,需要指定 -servername

1
openssl s_client -connect example.com:443 -servername example.com -tls1_2 </dev/null

查看完整握手信息

1
openssl s_client -connect example.com:443 -tls1_2 -showcerts </dev/null

这会显示:

  • 证书链
  • 协议版本
  • 加密套件
  • 服务器临时密钥

安全建议

协议 状态 建议
SSL 2.0 已废弃 禁用
SSL 3.0 已废弃 禁用
TLS 1.0 不安全 禁用
TLS 1.1 不安全 禁用
TLS 1.2 安全 保留
TLS 1.3 推荐 启用

常见问题

连接超时

1
2
# 使用 timeout 命令限制等待时间
timeout 5 openssl s_client -connect example.com:443 -tls1_2 </dev/null

OpenSSL 版本过低

TLS 1.3 需要 OpenSSL 1.1.1 或更高版本:

1
2
openssl version
# 需要: OpenSSL 1.1.1 或更高

参考来源