配置web服务端对https进行抓包

之前提到可以抓取浏览器发起的 https 请求包,有时候需要抓取服务器端发起的 https 请求包

例如对于一个庞大的 web 项目,怎么抓取服务端中主动发起的 https 请求呢?

检查版本支持

这里以 phpstudy 为例,当在 php 代码主动发起一个 https 请求,那么其执行路径是

php代码 --> curl 组件(C代码) --> openssl(C代码)

在站点下增加一个 phpinfo.php 文件

php 复制代码
<?php
phpinfo();

访问 phpinfo 地址,查看使用的 openssl 版本支持情况

SSLKEYLOGFILE 在 OpenSSL 1.1.1 以及更高的版本中引入的,因此该版本是支持 https 报文抓包的

对 SSLKEYLOGFILE 的配置 ,可以参考 https://blog.csdn.net/weixin_53109623/article/details/145132550

测试抓包情况

通过进程列表可以知道,在 phpstudy 中是使用 php-cgi 执行 php 脚本的

新建一个 test_ssl.php 文件,输入以下内容,使用 php-cgi -f test_ssl.php 直接执行脚本

发现 SSLKEYLOGFILE 文件可以被正常写入 TLS 加密密钥信息的

但是将该文件放置于站点的目录下,使用浏览器的方式进行访问,SSLKEYLOGFILE 文件并没有被写入加密密钥信息

php 复制代码
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.baidu.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  // 禁用 SSL 验证(用于调试)
curl_exec($ch);
curl_close($ch);

问题分析

因为出于安全考虑,apache 在启动子进程的时候,并没有将所有的环境变量传递给 php-cgi 子进程

通过 phpinfo.php 页面中,可以查看到,仅有有限的部分环境变量别传给了子进程

这里通过浏览器访问 test_ssl.php 的请求抓包,需要的 SSLKEYLOGFILE 环境变量就没有传给子进程

配置抓包

在 apache 的配置环境变量传递给子进程有两种方式,分别是 SetEnv/PassEnv 以及 FcgidInitialEnv

SetEnv/PassEnv 传递环境变量

在 apache 的配置文件 httpd.conf 中最后增加配置,然后重启 apache 生效

复制代码
SetEnv SSLKEYLOGFILE C:\\SSL\\KEY.LOG

浏览器请求 phpinfo 页面,显示传递的环境变量出现在 PHP Variables$_ENV 数组中

$_ENV 存储的值是 php 中的环境变量,可以被 php 代码的 getenv 函数识别出来

但是这个是 php 中的环境变量,只在 php 环境中有效,并不能被底层 C 代码识别为系统环境变量

底层 C 代码使用的是系统函数 GetEnvironmentVariable 获取到环境变量,因此该设置对 C 代码是无效的

FcgidInitialEnv 传递环境变量

在 apache 的配置文件 httpd.conf 中最后增加配置,然后重启 apache 生效

复制代码
FcgidInitialEnv SSLKEYLOGFILE "C:\\SSL\\KEY.LOG"

浏览器请求 phpinfo 页面,显示传递的环境变量出现在 Environmnet 的记录中

这种方式配置传递的环境变量,可以被 C 代码正确识别,因此请求 test_ssl.php 页面时密钥信息被正确写入

子进程的环境变量

当一个进程启动的时候,main 方法的的签名有三个参数,envp 参数表示环境变量

如果不做特别设置的话,envp 的值就是系统环境变量的集合

c 复制代码
int main(int argc, char *argv[], char *envp[]) {
    ...
}

当父进程通过 CreateProcess 创建子进程的时候,可以通过第 7 个参数来控制环境变量

NULL 表示继承父进程的所有环境变量,否则就是指定有限的环境变量传递给子进程

c 复制代码
    // 调用CreateProcess来创建子进程
    if (CreateProcess(
            NULL,               // 应用程序路径
            "child_program",     // 子进程的命令行
            NULL,               // 进程安全属性
            NULL,               // 线程安全属性
            FALSE,              // 是否继承父进程的句柄
            CREATE_NEW_CONSOLE, // 启动新控制台
            NULL,               // 子进程的环境变量(NULL表示继承父进程的环境变量)
            NULL,               // 当前工作目录
            &si,                // 启动信息
            &pi                 // 进程信息
        )) {
        printf("子进程创建成功\n");
    } else {
        printf("子进程创建失败: %d\n", GetLastError());
    }
相关推荐
闲云野鹤在人间19 小时前
docker 入门 | 第5章 网络详解
网络·docker·架构·华为云·php
PHP实战开发录21 小时前
MySQL连接数为什么会打满
系统架构·php·开发
VXbishe21 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务
aixingpan1 天前
aixingpan.cn API开发文档:api_docs_bichart_natalvssolar_return2接口指南
前端·php
曦夜日长1 天前
Linux系统篇,进程概念(四):内核链表的深度理解、进程优先级的底层理解
linux·运维·服务器·php
其实防守也摸鱼1 天前
DeepSeek Harness 开源贡献手记:从入门到合入主线
服务器·数据库·windows·https·ssl
Lsetea1 天前
OpenSSL快速生成域名证书:含SAN的自签命令、验证与排错
nginx·https·ssl证书·openssl·自签证书
2501_916008891 天前
SSE 和 gRPC 流式接口如何抓包,调试 SSE 与 gRPC 流式接口
网络协议·计算机网络·网络安全·ios·adb·https·udp
其实防守也摸鱼1 天前
堆叠注入(Stacked Injection)详解
服务器·数据库·windows·https·ssl
4SAPI2 天前
企业大模型API服务商推荐:从多模型接入到AI API Gateway的技术选型分析
人工智能·php