You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用tcpdump和tshark获取TLS指纹算法名称及相关扩展信息?

获取TLS Client Hello完整指纹信息方案

一、解决tshark显示名称及扩展信息的命令

tshark默认只输出编号是因为未启用名称解析,使用以下命令可获取Client Hello的完整字段(包括扩展项、椭圆曲线名称、点格式):

# 精准提取指定字段并显示名称
tshark -r your_capture.pcap -Y "tls.handshake.type == 1" -T fields \
-e tls.handshake.version \
-e tls.handshake.ciphersuite \
-e tls.handshake.extensions \
-e tls.handshake.elliptic_curve \
-e tls.handshake.elliptic_curve_point_format \
-d tcp.port==443,tls \
--enable-protocol tls

如果需要直观查看所有细节,直接用展开式输出:

tshark -r your_capture.pcap -Y "tls.handshake.type == 1" -V

-V参数会展开所有协议细节,自动将编号映射为名称(比如secp256r1而非0x0017)。若仍只显示编号,建议升级到Wireshark/tshark 3.0+版本,旧版本的名称映射库不全。

二、替代方案:服务端直接解析Client Hello

如果不想依赖抓包,可采用以下轻量方案:

  1. Go编写TLS前置解析服务
    Go的tls原生包可直接解析Client Hello的所有字段,无需完成完整TLS握手,性能开销极低。示例代码:
package main

import (
    "crypto/tls"
    "fmt"
    "net"
)

func handleConn(conn net.Conn) {
    defer conn.Close()
    _, _ = tls.Server(conn, &tls.Config{
        GetConfigForClient: func(hello *tls.ClientHelloInfo) (*tls.Config, error) {
            // 打印TLS版本
            fmt.Printf("TLS Version: %s\n", tls.VersionName(hello.Version))
            // 打印加密套件名称
            fmt.Println("Cipher Suites:")
            for _, cs := range hello.CipherSuites {
                fmt.Printf("  %s\n", tls.CipherSuiteName(cs))
            }
            // 打印椭圆曲线名称
            fmt.Println("Elliptic Curves:")
            for _, ec := range hello.SupportedCurves {
                fmt.Printf("  %s\n", tls.CurveName(ec))
            }
            // 打印椭圆曲线点格式
            fmt.Println("Elliptic Curve Point Formats:")
            for _, pf := range hello.SupportedPoints {
                switch pf {
                case tls.PointFormatUncompressed:
                    fmt.Println("  uncompressed")
                case tls.PointFormatCompressedPrime:
                    fmt.Println("  compressed_prime")
                case tls.PointFormatCompressedChar2:
                    fmt.Println("  compressed_char2")
                }
            }
            // 打印扩展项(可根据ID映射名称,如0x000b为SNI、0x0010为ALPN)
            fmt.Println("Extensions:")
            for extID := range hello.Extensions {
                fmt.Printf("  Extension ID: 0x%x\n", extID)
            }
            return nil, nil
        },
    }).Handshake()
}

func main() {
    ln, err := net.Listen("tcp", ":443")
    if err != nil {
        panic(err)
    }
    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Printf("Accept error: %v\n", err)
            continue
        }
        go handleConn(conn)
    }
}
  1. 扩展nginx-ssl-fingerprint工具
    基于原工具的OpenSSL调用逻辑,新增对SSL_get_client_hello返回结构中extensions、elliptic_curves、ec_point_formats字段的解析,同时通过OpenSSL的映射函数将编号转为名称。

三、注意事项

  • tshark的名称解析依赖内置的协议数据库,低版本可能缺失部分映射,升级版本即可解决。
  • Go方案需注意高并发场景的连接处理,可结合连接池或高性能网络框架优化。

内容的提问来源于stack exchange,提问作者geekbyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:52:47