1,准备:
- 操作系统环境:win10
- nginx源码:1.22.1,需要去hg官网:https://hg.nginx.org/nginx/rev/af7a3fb7558f下载,
不要去https://nginx.org/download/下载,因为nginx.org/download这里下载的是适用于Linux环境下的,下载完成之后编译时会报错缺少win32部分内容,查询相关资料后确定nginx.org/download/上的源码缺失win32部分源码
nginx源码下载 - 通过官方编译手册说得知,编译所需要的依赖库包含PCRE、zlib和OpenSSL三部分的源码和Strawberry Perl工具

官网编译说明
2,修改Nginx源码
为了方便后续代码管理,适用git生成patch文件
- 初始化一个临时 git 仓库
cd ~/nginx-orig
git init
git add .
git commit -m "original version"
- 复制修改后文件替换掉旧文件,或者手动修改代码文件
- 生成 patch
git diff > ~/sslkeylog.patch
- 拿到patch文件后在新的源码环境下直接运行下面代码即可得到修改后的文件。
patch -Np1 -i 【patch文件路径】
例:patch -Np1 -i //home/user1/nginx-sslkeylog-master/nginx-patches/1.22.1.patch
源码中需要修改的点
①auto/cc/msvc文件
echo " + cl version: $NGX_MSVC_VER"
上面新增一行
NGX_MSVC_VER=19.29
版本号的查看如下图,打开vs命令行,执行cl

打开vs命令行

查看编译器版本
②auto/lib/openssl/makefile.msvc文件

修改前

修改后
③源码根目录(nginx-af7a3fb7558f)下新建objs/lib

lib下放入待编译模块
3,使用MSYS运行configure
auto/configure --with-cc=cl --sbin-path=nginx.exe --with-pcre=objs/lib/pcre-8.44 --with-zlib=objs/lib/zlib-1.3.1 --add-module=objs/lib/nginx-sslkeylog-master --with-http_ssl_module --with-openssl=objs/lib/openssl-1.1.1w --prefix=.

config结果
4,使用VS运行nmake

开始编译

编译完成
在objs文件夹下面找到nginx.exe可执行文件
5,去官网下载用于win下的可执行程序

下载对应版本的win版可执行程序
用编译得到的nginx.exe替换掉下载文件夹中的nginx.exe

用1替换掉2
6,config配置
最后在nginx的config文件( nginx1.22.1/conf/nginx.conf )中加入sslkeylog留存配置,然后运行可执行程序启动nginx
http {
...
map $sslkeylog_shts $log_shts {
'' '';
default 'SERVER_HANDSHAKE_TRAFFIC_SECRET $sslkeylog_cr $sslkeylog_shts\n';
}
map $sslkeylog_chts $log_chts {
'' '';
default 'CLIENT_HANDSHAKE_TRAFFIC_SECRET $sslkeylog_cr $sslkeylog_chts\n';
}
map $sslkeylog_sts $log_sts {
'' '';
default 'SERVER_TRAFFIC_SECRET_0 $sslkeylog_cr $sslkeylog_sts\n';
}
map $sslkeylog_cts $log_cts {
'' '';
default 'CLIENT_TRAFFIC_SECRET_0 $sslkeylog_cr $sslkeylog_cts\n';
}
map $sslkeylog_es $log_es {
'' '';
default 'EXPORTER_SECRET $sslkeylog_cr $sslkeylog_es\n';
}
map $sslkeylog_ees $log_ees {
'' '';
default 'EARLY_EXPORTER_SECRET $sslkeylog_cr $sslkeylog_ees\n';
}
map $sslkeylog_cets $log_cets {
'' '';
default 'CLIENT_EARLY_TRAFFIC_SECRET $sslkeylog_cr $sslkeylog_cets\n';
}
map $ssl_protocol $keylog_lines {
'TLSv1.3' "$log_cets$log_ees$log_shts$log_chts$log_es$log_sts$log_cts";
'' '';
default "CLIENT_RANDOM $sslkeylog_cr $sslkeylog_mk\n";
}
log_format sslkeylog escape=none '$keylog_lines';
access_log logs/sslkeys.log sslkeylog;
...
}
