TLS指纹综述
最近在研究某些魔法客户端的识别,发现TLS指纹是其重要特征之一,遂整理一篇。
1、TLS指纹历史

2017年之前,TLS指纹主要依赖客户端或服务器的握手报文特征,如Cipher Suites顺序、扩展顺序等,手工分析和匹配,没有像JA3/JA3S这样的标准化哈希指纹方法。
2017年,John Althouse在Salesforce工作期间提出JA3/JA3S指纹,定义标准化TLS指纹格式并迅速在工业界普及。
2019年,Sergey Frolov等人[1]提出了uTLS,用于对抗TLS指纹校验。
2022年,Chrome在107版本中加入随机TLS扩展顺序的特性,对抗JA3指纹。
2023年,John Althouse在FoxIO工作期间提出JA4+系列指纹,旨在扩充协议广度和解决JA3指纹在TLS扩展随机化方面的局限性。解决了Chrome指纹随机化问题。
2、JA3指纹
JA3指纹由如下5部分组成:
<TLSVersion>,<CipherSuites>,<Extensions>,<SupportedGroups>,<ECPointFormats>
- TLSVersion:ClientHello包中TLS的版本字段,不是TLS层中的版本字段
- CipherSuites:客户端支持的密码套件列表
- Extensions:客户端支持的扩展类型列表,只取Type字段
- SupportedGroups:客户端支持的椭圆曲线或有限域参数组列表,旧称EllipticCurves
- ECPointFormats:客户端支持的椭圆曲线公钥点的编码格式
GREASE(Generate Random Extensions And Sustain Extensibility)是TLS协议的一种机制,客户端通过在ClientHello等消息中插入随机保留值,保证协议未来可扩展、互操作性强且升级平滑。GREASE本身没有实际意义,它只是测试对未知值的容错能力,因此在实际握手中不会影响协商的最终结果。在计算JA3指纹时,需要忽略此字段。
JA3的不同部分用,连接,相同部分的列表元素用-连接,且都用10进制表示,最后进行md5哈希运算。
下面给出一个实例:

该包的JA3原始字符串为:
771,
49195-49199-49196-49200-52393-52392-49161-49171-49162-49172-49170-4865-4866-4867,
0-5-10-11-13-65281-23-16-18-43-51,
29-23-24-25,
0
JA3指纹为:
fd75aaca18604d62f2bc8b02b345140f
3、JA3S指纹
JA3指纹用于刻画TLS中的ClientHello包,而JA3S则用于刻画TLS中的ServerHello包。JA3S包含如下3个字段
<TLSVersion>,<CipherSuites>,<Extensions>
- TLSVersion:服务端支持的TLS版本,可能与客户端不同
- CipherSuites:服务端选择的加密套件,仅一个
- Extensions:服务端选择的扩展列表
下面给出与上述JA3同一个流的JA3S实例:

该包的JA3S原始字符串为:
771,4865,43-51
JA3S指纹为:
f4febc55ea12b31ae17cfb7e614afda8
4、JA4指纹
由上述可见,JA3指纹的抗扰动能力很弱,随便打乱一下密码套件或扩展的顺序就足以使指纹大变,所以便有了JA4指纹。
JA4指纹是JA4+指纹系列中的一员,JA4+指纹如下:

John Althouse在他的X上进行了详细的介绍,这里挑选JA4和JA4S进行介绍。

由上图可见,JA4指纹模块化了,其由JA4_a、JA4_b、JA4_c三部分组成。JA4同JA3指纹一样,同样忽略GREASE字段。
- JA4_a:由概览信息构成,长度固定。注意这里的TLS版本是客户端支持的最高TLS版本,有时会出现在Supported Version扩展中,JA3则不会判断扩展中的TLS版本
- JA4_b:由从小到大的加密套件组成,用
,分割,最后做SHA256哈希运算,并取前12位。与JA3不同的是这里使用16进制表示 - JA4_c:由除去SNI扩展名(0000)和ALPN扩展名(0010)的扩展列表和Signature Algorithms扩展中的字段列表组成,同样是16进制,但是并没有从小到大排序,而是按照原本顺序。随后将二者用
_拼接
下面是一个JA4的原始字符串,该包与上述JA3对应:
t13d1411h2_
1301,1302,1303,c009,c00a,c012,c013,c014,c02b,c02c,c02f,c030,cca8,cca9_
0005,000a,000b,000d,0012,0017,002b,0033,ff01_
0804,0403,0807,0805,0806,0401,0501,0601,0503,0603,0201,0203
JA4指纹为:
t13d1411h2_cbb2034c60b8_e7c285222651
5、JA4S指纹
JA4S同样由JA4S_a、JA4S_b、JA4S_c三部分组成。

- JA4S_a:JA4S_a和JA4_a相比,去掉了SNI Extensions和Ciper Suite的个数
- JA4S_b:服务端选择的加密套件,16进制表示
- JA4S_c:服务端选择的扩展列表,去除SNI和APLN扩展,用
,分割,16进制表示,最后取SHA256哈希前12位
下面举出与上述JA4对应的JA4S原始字符串:
t130200_
1301_
002b,0033
JA4指纹为:
t130200_1301_a56c5b993250
References
[1] Frolov S, Wustrow E. The use of TLS in Censorship Circumvention[C]//NDSS. 2019.