首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
开源项目
发新帖
5
33
[原创] 纯 Go 复刻浏览器 TLS HTTP/2 指纹:我写了一个可开源的库(JA3/JA4 逐字节一致,零 CGO)
发表于: 2026-9-4 10:23
627
[原创] 纯 Go 复刻浏览器 TLS HTTP/2 指纹:我写了一个可开源的库(JA3/JA4 逐字节一致,零 CGO)
灵谷
2026-9-4 10:23
627
> 作者:lingulingo 更新时间:2026 > 项目仓库:<mark class="encrypted">ad4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9h3&6Y4N6h3I4A6L8X3N6G2i4K6u0r3N6r3I4K6M7s2u0A6L8Y4b7`.</mark> ## 一、为什么"浏览器指纹"这么重要 很多网站在你请求时会判断"你是不是真人浏览器"。这个判断往往**不只是看 User-Agent**,而是看你**连 TLS 握手都发了什么**——你的浏览器在 ClientHello 里带的**密码套件顺序、扩展顺序、支持的曲线、签名算法**,以及后面 HTTP/2 的 **SETTINGS 顺序、WINDOW_UPDATE、伪头/请求头顺序**,**每一家浏览器都不一样**,这就是"TLS 指纹"。 业界用 **JA3 / JA4** 给它打指纹。给个真实例子: ```text # Chrome 152 的 JA3(前两段就是密码套件 & 扩展顺序) 771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53, 45-17613-13-43-10-0-51764-18-51-35-27-11-5-65281-16-65037-23,4588-29-23-24,0 # Akamai 的 HTTP/2 指纹 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p ``` 如果你用 Go 默认的 `net/http` 发起请求,它的 TLS 指纹和浏览器**完全不一样**,很多站点看一眼就判定为"不是浏览器",直接给你 403 或跳到验证页。 ## 二、现状:市面上的方案都"有一点问题" | 方案 | 做法 | 痛点 | |---|---|---| | uTLS | 自己造的 TLS 栈,能模仿浏览器 | 只有引擎,其他全要你自己写;指纹定义绑死在代码里 | | tls-client / go-bypasser | 基于 uTLS 的 HTTP 客户端 | 依赖整个引擎;**HTTP/2 层仍是 Go 默认,不逐字节** | | curl_cffi / pyhttpx | C 语言 libcurl 封装 | **需要 CGO/原生库**,跨平台编译头大 | 而且大部分库的"HTTP/2 指纹"都**没做**——只把 TLS 做精确,HTTP/2 却走 Go 默认实现,两个加起来其实还是对不上真实浏览器的完整行为。 ## 三、我的思路:拆成"标准数据层 + 可选字节精确引擎" 所以我写了 **<a href="elink@862K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9h3&6Y4N6h3I4A6L8X3N6G2i4K6u0r3N6r3I4K6M7s2u0A6L8Y4b7`.">tlsprint</a>**,一个**引擎无关的 Go TLS 指纹库**: 1. **指纹 = 纯数据**。用类型化、可 JSON、可版本化的 `Profile` 描述"客户端到底发了什么"(密码套件、扩展顺序、曲线、签名算法、HTTP/2 设置、请求头顺序……)。任何引擎(uTLS、tls-client、你自己写的)都能消费。 2. **可选引擎逐字节还原**。通过 `utls` 子模块驱动 uTLS 拨号,通过 `client` 子模块提供 HTTP 客户端,并通过 **fork 的 `x/net/http2`** 把 **HTTP/2 也给逐字节做精确**。 ## 四、它有哪些亮点 - **纯 Go、零 CGO**:整条链路(TLS 走 uTLS、HTTP/2 走 fork 的 x/net/http2)只用 Go 工具链就能编译,**不需要 libcurl、不需要 .so/.dll**,跨平台无障碍。 - **引擎无关的数据层**:根模块**零第三方依赖(仅标准库)**,指纹是可复用的纯数据。 - **TLS 和 HTTP/2 都字节精确**:JA3/JA4 与抓包一致;HTTP/2 的 **SETTINGS 顺序、WINDOW_UPDATE、伪头/请求头顺序、流优先级**都还原到真实浏览器。下面有实测。 - **双向编解码**:不只是"算" JA3/JA4,还能**逐字节解析/构造 ClientHello**,未知扩展原样保留。 - **内置 47 个真实、可校验的预设**(Chrome 含 152、Firefox、Safari、Edge、Opera、curl、OkHttp、WeChat 等),每个都通过"列表能反推出源 JA3"的不变量测试。 - **curl_cffi 式舒服 API**:指纹直接传在调用里,浏览器默认头会自动带上。 ## 五、10 秒上手 ```bash go mod init myapp go get github.com/lingulingo/tlsprint/client@v1.0.0 ``` ```go package main import ( "fmt" tlsclient "github.com/lingulingo/tlsprint/client" ) func main() { // 就像 curl_cffi 的 requests.get(url, impersonate="chrome") resp, err := tlsclient.Get("https://tls.peet.ws/api/all", tlsclient.Impersonate("chrome-152"), // 指纹:还支持 firefox-145 / safari-26-0-1 / chrome=最新 tlsclient.Query("q", "tls fingerprint"), // 查询参数 tlsclient.Header("X-Api-Key", "secret"), // 请求头(浏览器头会自动带) ) if err != nil { panic(err) } fmt.Println(resp.StatusCode(), resp.Proto()) // 200 HTTP/2.0 fmt.Println(resp.String()) // 响应体(自动按 Content-Encoding 解压) } ``` ## 六、完整示例:看指纹、拨号、发请求 **1. 查预设 + 算指纹** ```go p := preset.MustBuiltin().Lookup("chrome-152") fmt.Println(p.Key, p.Product, p.Version, p.UserAgent()) s := ja3.FromProfile(&p.TLS) // 规范 JA3 字符串 fmt.Println(s, ja3.Hash(s)) // + 经典 md5 指纹 id ``` **2. 直接拨号(自己写 HTTP)** ```go conn, err := tlsutls.DialByName(ctx, "tcp", "example.com:443", "chrome-152", nil) defer conn.Close() ``` **3. 作为 HTTP 客户端(POST JSON 自动反序列化)** ```go var result map[string]any resp, err := tlsclient.Post("https://httpbin.org/post", tlsclient.Impersonate("chrome-152"), tlsclient.Body(map[string]any{"name": "tlsprint"}), tlsclient.Result(&result), ) fmt.Println(result) ``` ## 七、HTTP/2 指纹为什么"能做逐字节" `client` 依赖我 fork 的 `tlsprint/http2`(基于 `golang.org/x/net/http2`)。我给它加了一个 `Fingerprint` 配置,把预设里的 **HTTP/2 指纹**直接写进连接序言和请求帧: ```go // 从预设自动生成的连接指纹 Settings = []Setting{{HeaderTableSize, 65536}, {EnablePush, 0}, {InitialWindowSize, 6291456}, {MaxHeaderListSize, 262144}} WindowUpdate = 15663105 PseudoHeaderOrder = "m,a,s,p" // :method,:authority,:scheme,:path HeaderOrder = [sec-ch-ua, sec-ch-ua-mobile, ..., priority] Priority = {Exclusive:true, Weight:255} ``` **实测**:服务端上报的 `akamai_fingerprint` 是: ```text 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p ``` 和 Chrome 152 抓包**完全一致**;请求头顺序也和抓包逐字节一致。(有断言测试覆盖。) ## 八、实战:带有效 cookie 拿真实商品页 我是这么验证"它能干活"的——用 `chrome-152` + 一份新鲜的会话 cookie 请求一个被 Akamai 保护的电商页: ```go resp, _ := tlsclient.Get(gucciURL, tlsclient.Impersonate("chrome-152"), tlsclient.CookieHeader(sessionCookie), // 从真实 Chrome/无痕拿的 _abck/bm_sz 等 ) // => 200 HTTP/2.0,解压后 408KB 的真实商品页 HTML(含 Gucci) ``` 拿到**真实商品页**,不是验证页。这说明"连接层 + 指纹 + cookie"整条链路是通的。 ## 九、诚实说:它的边界在哪 - **指纹本身是字节精确的**(TLS + HTTP/2 都验证过)。 - **但"活动 JS 挑战"是另一回事**:像 Akamai sensor、Cloudflare 托管挑战这种需要**执行 JS** 拿 cookie 的,任何 HTTP 客户端都过不了——那是无头浏览器/挑战求解器的活儿。**能不能过这类站,取决于 cookie 是否新鲜,与指纹无关。**(所以最佳实践是:用无头浏览器跑一次拿 cookie,再回灌给 tlsprint 发后续请求。) - **预设覆盖 47 个**(可扩展,有导入管线);`http2` 是 fork,需跟 `x/net/http2` 上游同步(已附 NOTICE 声明许可)。 ## 十、应用场景 - **爬虫/风控研究**:模拟真实浏览器指纹,减少被 WAF 拦截。 - **反爬对抗测试**:验证自家站点的 WAF 判定是否过严/是否有指纹差异。 - **安全研究**:解析/构造 ClientHello、对比不同实现。 - **TLS 教学**:JA3/JA4 到底怎么来的,一步步算给你看。 ## 十一、总结 `tlsprint` 想做的,是把"指纹"这件事**做得标准、纯 Go、且真正的双向字节精确**,把"数据层"和"引擎"解耦,让**任何 Go 项目**都能轻松接入。它不依赖 CGO、根模块零依赖、API 顺手,还带 47 个可校验的真实预设和一遍完整的真实站点验证。 如果你觉得有用,欢迎去 GitHub 点个 **star ⭐**、提 Issue 或 PR(新增指纹预设、更好的 HTTP/2 保真度、文档都可以): - 仓库:<mark class="encrypted">dc0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9h3&6Y4N6h3I4A6L8X3N6G2i4K6u0r3N6r3I4K6M7s2u0A6L8Y4b7`.</mark> - 安装:`go get github.com/lingulingo/tlsprint/client@v1.0.0` --- **声明**:本文仅用于 TLS 协议研究与反爬对抗测试,请只对你**有权测试**的系统使用。项目为 MIT 协议,`http2` 子模块派生自 `golang.org/x/net/http2`(BSD-3-Clause,遵循上游)。
回复或点赞可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
最后于
2026-9-15 14:20 被灵谷编辑 ,原因: 描述不太准确
收藏
・
5
点赞
・
33
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
我的小拇指啊
感谢你的贡献,论坛因你而更加精彩!
5天前
mb_udritawf
非常支持你的观点!
2026-9-29 20:47
tank小王子
+6
你的分享对大家帮助很大,非常感谢!
2026-9-29 20:02
git_99440qimingminimax
为你点赞!
2026-9-23 11:53
小傲骨
感谢你的贡献,论坛因你而更加精彩!
2026-9-17 17:53
ONewTach
谢谢你的细致分析,受益匪浅!
2026-9-17 16:53
git_67235Quocdev03
+1
为你点赞!
2026-9-15 13:38
sergiojune
感谢你的积极参与,期待更多精彩内容!
2026-9-15 07:14
mb_pdclsysg
感谢你的贡献,论坛因你而更加精彩!
2026-9-14 14:04
seraphn
期待更多优质内容的分享,论坛有你更精彩!
2026-9-13 17:11
the_hs
感谢你的贡献,论坛因你而更加精彩!
2026-9-13 13:42
git_51951meggadf3df
非常支持你的观点!
2026-9-10 10:53
smalls0098
+1
期待更多优质内容的分享,论坛有你更精彩!
2026-9-9 12:28
wx_春风十里
你的分享对大家帮助很大,非常感谢!
2026-9-9 08:26
晨曦。
为你点赞!
2026-9-9 07:11
LuoJunJunJun
谢谢你的细致分析,受益匪浅!
2026-9-8 17:36
mb_gjttoonf
你的帖子非常有用,感谢分享!
2026-9-8 10:17
git_29575booksnature
期待更多优质内容的分享,论坛有你更精彩!
2026-9-7 21:12
程序原
感谢你的贡献,论坛因你而更加精彩!
2026-9-7 19:47
mb_zsmeyemp
为你点赞!
2026-9-5 09:50
mb_cantkdlj
你的帖子非常有用,感谢分享!
2026-9-5 04:52
mb_rjdrqvpa
感谢你的积极参与,期待更多精彩内容!
2026-9-4 21:19
clz3216
感谢你分享这么好的资源!
2026-9-4 21:01
ptr1234565
谢谢你的细致分析,受益匪浅!
2026-9-4 18:02
风兮木晓
谢谢你的细致分析,受益匪浅!
2026-9-4 17:47
mb_bruchdxp
感谢你的积极参与,期待更多精彩内容!
2026-9-4 17:11
顽劣
为你点赞!
2026-9-4 16:29
Ⅿalware
为你点赞!
2026-9-4 15:33
wx_cz_111
非常支持你的观点!
2026-9-4 15:31
mb_hzfcelhs
这个讨论对我很有帮助,谢谢!
2026-9-4 13:45
mb_cebxltxx
为你点赞!
2026-9-4 11:49
mb_cfjwplfo
非常支持你的观点!
2026-9-4 11:16
qqizai
期待更多优质内容的分享,论坛有你更精彩!
2026-9-4 11:05
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
17
)
mb_ldbucrik
雪 币:
6
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
708
粉丝
7
关注
私信
mb_ldbucrik
2
楼
向大佬学习
2026-9-4 14:11
0
拍拖
雪 币:
2790
活跃值:
(7151)
能力值:
( LV6,RANK:90 )
在线值:
发帖
22
回帖
436
粉丝
15
关注
私信
拍拖
2
3
楼
感谢分享
2026-9-4 15:12
0
xingbing
雪 币:
158
活跃值:
(5806)
能力值:
( LV2,RANK:10 )
在线值:
发帖
2
回帖
1402
粉丝
2
关注
私信
xingbing
4
楼
感谢分享。
2026-9-4 15:17
0
Imxz
雪 币:
110
活跃值:
(9576)
能力值:
( LV2,RANK:10 )
在线值:
发帖
6
回帖
775
粉丝
9
关注
私信
Imxz
5
楼
tql
2026-9-4 17:30
0
灵谷
雪 币:
254
能力值:
( LV1,RANK:0 )
在线值:
发帖
2
回帖
2
粉丝
3
关注
私信
灵谷
6
楼
如果 tlsprint 帮到了你,请给它点个 star
2026-9-4 20:22
0
mb_kvudlizw
雪 币:
200
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
4
粉丝
0
关注
私信
mb_kvudlizw
7
楼
向大佬学习
2026-9-5 00:25
0
hasikill
雪 币:
220
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
5
粉丝
0
关注
私信
hasikill
8
楼
6
2026-9-7 15:18
0
温泉划水鱼
雪 币:
94
能力值:
( LV1,RANK:0 )
在线值:
发帖
6
回帖
226
粉丝
28
关注
私信
温泉划水鱼
9
楼
看看
2026-9-7 19:26
0
kxblah
雪 币:
3051
活跃值:
(3405)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
70
粉丝
1
关注
私信
kxblah
10
楼
6
2026-9-7 19:35
0
mb_qztkkwxt
雪 币:
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
60
粉丝
0
关注
私信
mb_qztkkwxt
11
楼
学习
2026-9-10 16:41
0
文西哥
雪 币:
8340
活跃值:
(7534)
能力值:
( LV2,RANK:10 )
在线值:
发帖
1
回帖
98
粉丝
10
关注
私信
文西哥
12
楼
学习学习
2026-9-13 11:24
0
mb_wfqcntgg
雪 币:
0
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
11
粉丝
0
关注
私信
mb_wfqcntgg
13
楼
6666
2026-9-15 12:45
0
AK1988DA
雪 币:
74
活跃值:
(875)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
112
粉丝
0
关注
私信
AK1988DA
14
楼
43443
2026-9-15 17:31
0
哇哈哈919
雪 币:
3120
活跃值:
(2159)
能力值:
( LV3,RANK:20 )
在线值:
发帖
8
回帖
20
粉丝
2
关注
私信
哇哈哈919
15
楼
66666
2026-9-17 16:35
0
Ace_Heng
雪 币:
127
活跃值:
(677)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
46
粉丝
0
关注
私信
Ace_Heng
16
楼
看看
2026-9-17 17:08
0
mb_ajhodang
雪 币:
217
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
11
粉丝
0
关注
私信
mb_ajhodang
17
楼
看看
2026-9-29 19:45
0
mb_tjqabdvq
雪 币:
235
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
20
粉丝
0
关注
私信
mb_tjqabdvq
18
楼
给大佬点赞 学习了
1天前
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
灵谷
2
发帖
2
回帖
0
RANK
关注
私信
他的文章
[原创]某App 抓包全流程技术文档
1004
[原创] 纯 Go 复刻浏览器 TLS HTTP/2 指纹:我写了一个可开源的库(JA3/JA4 逐字节一致,零 CGO)
627
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部