编译带有 JA4 指纹的 OpenResty

编译带有 JA4 指纹的 OpenResty

想用 OpenResty 收集 JA4 指纹信息,以便后续进一步处理。找了一圈没找到文章代码仓库之类的,遂写篇文章记录下。

由于各方面仍在进一步开发中,文章受限于版本问题,只对我写这篇博客的时候有效,若更新需要进一步验证

修改编译

OpenResty 我用的是我这时候的最新版本 1.27.1.2。OpenResty 基于 Nginx 修改而来,版本号前面对应的就是 Nginx 的版本号。在 JA4 的官方仓库里,可以找到官方对 Nginx 的支持模块,我写这篇文章的时候对应的仓库及版本 FoxIO-LLC / ja4-nginx-module.

由于 OpenResty 和 ja4-nginx-module 都对 Nginx 源码进行了修改 patch,分析了一下 OpenResty 的修改比较多,因此在 OpenResty 的基础上 patch 以支持 ja4-nginx-module

首先下载 OpenResty 源码

1
2
3
wget https://openresty.org/download/openresty-1.27.1.2.tar.gz
tar -xzvf openresty-1.27.1.2.tar.gz
cd openresty-1.27.1.2/

然后参考 ja4-nginx-module 里 Dockerfile 的步骤进行编译

下载 OpenSSL,这里参考 Dockerfile 使用3.5.4的版本,参考 https://github.com/FoxIO-LLC/ja4-nginx-module/pull/38 可知 OpenSSL3.0 版本开始已经能够正常工作不需要 patch。OpenResty 中也有针对 OpenSSL 的 patch,但是我们用不上那些功能,因此可以忽略

1
2
wget https://github.com/openssl/openssl/releases/download/openssl-3.5.4/openssl-3.5.4.tar.gz
tar -xzvf openssl-3.5.4.tar.gz

下载 ja4-nginx-module

1
git clone https://github.com/FoxIO-LLC/ja4-nginx-module.git

然后应用对应的 patch

1
2
cd bundle/nginx-1.27.1/
patch -p1 < ../../ja4-nginx-module/patches/nginx.patch

尽管在 Dockerfile 中这个是对应 Nginx 1.28.1 的 patch,但是这里能够直接应用且编译时不会报错

patch_nginx

接下来运行 configure,可以按实际需要进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
cd ../../
./configure \
--with-openssl=openssl-3.5.4 \
--add-module=ja4-nginx-module/src \
--with-debug \
--with-compat \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_v3_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-pcre-jit

然后直接

1
make -j$(nproc)

就可以了。OpenResty 在编译的时候会顺带编译 OpenSSL,不需要我们另外去 configure 再 make。在测试过程中有次出现了报错,但重试就没了。

最后

1
sudo make install

即可完成安装

测试

编辑 nginx.conf 文件,添加上如下内容即可测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 443 ssl;

server_name localhost;

ssl_certificate cert.pem;
ssl_certificate_key key.pem;

# prevent caching issue w/ signature algorithm extension
ssl_session_cache off;

location / {
add_header Content-Type text/plain;
return 200 "
JA4: $http_ssl_ja4\n
JA4 String: $http_ssl_ja4_string\n
JA4one: $http_ssl_ja4one\n
JA4S: $http_ssl_ja4s\n
JA4S String: $http_ssl_ja4s_string\n
JA4H: $http_ssl_ja4h\n
JA4H String: $http_ssl_ja4h_string\n
JA4T: $http_ssl_ja4t\n
JA4T String: $http_ssl_ja4t_string\n
JA4TS: $http_ssl_ja4ts\n
JA4TS String: $http_ssl_ja4ts_string\n
JA4X: $http_ssl_ja4x\n
JA4L: $http_ssl_ja4l\n
";
}
}

其中,server_name 以及 ssl_certificatessl_certificate_key 按实际配置,需要配置证书才能有 ssl,才可以有 JA4 指纹。

ja4_result

可以看到工作正常。

其他

如果要使用要使用异步 SSL session,需要应用 OpenResty 里 patches 的补丁

1
2
cd openssl-3.5.4/
patch -p1 < ../patches/openssl-3.4.1-sess_set_get_cb_yield.patch

OpenSSL 3.5.4 可以直接应用 3.4.1 的补丁,patch 后重新 configure 和 make 编译即可

本文作者:lrhtony
本文链接:https://lrhtony.cn/2026/01/27/Compile-OpenResty-with-JA4/
版权声明:本文采用 CC BY-NC-SA 4.0 协议进行许可