如何用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
如果不想依赖抓包,可采用以下轻量方案:
- 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) } }
- 扩展nginx-ssl-fingerprint工具
基于原工具的OpenSSL调用逻辑,新增对SSL_get_client_hello返回结构中extensions、elliptic_curves、ec_point_formats字段的解析,同时通过OpenSSL的映射函数将编号转为名称。
三、注意事项
- tshark的名称解析依赖内置的协议数据库,低版本可能缺失部分映射,升级版本即可解决。
- Go方案需注意高并发场景的连接处理,可结合连接池或高性能网络框架优化。
内容的提问来源于stack exchange,提问作者geekbyte
相关产品推荐
相关产品推荐

