Electron应用使用http-mitm-proxy拦截HTTPS请求失败求助
解决Electron中http-mitm-proxy无法拦截HTTPS请求的问题
问题根源
HTTPS拦截失效主要源于两个问题:
- 代理端口配置不一致,导致请求无法正确路由到代理服务器
- Electron默认不认可http-mitm-proxy生成的自签名CA证书,HTTPS请求因证书校验失败被阻断
修复方案及优化代码
1. 统一代理端口配置
你的代码中存在端口匹配错误:代理监听8088端口,但日志输出写为8080,同时代理规则里HTTP指向8080、HTTPS指向8088。http-mitm-proxy支持单端口同时处理HTTP和HTTPS请求,需统一端口配置。
2. 让Electron信任CA证书
http-mitm-proxy启动时会在指定的sslCaDir目录生成CA证书(文件名通常为ca.pem),需将该证书导入Electron会话的信任列表,或临时禁用证书校验(仅用于开发环境)。
完整修正代码
const { app, BrowserWindow, session } = require('electron'); const Proxy = require('http-mitm-proxy').Proxy; const path = require('path'); const fs = require('fs'); const proxy = new Proxy(); const logFilePath = path.join(__dirname, 'requests.log'); const certsDir = path.join(__dirname, 'certs'); const proxyPort = 8088; // 统一代理端口 app.on('ready', async () => { // 启动MITM代理 proxy.listen({ port: proxyPort, sslCaDir: certsDir }, () => { console.log(`MITM proxy listening on port ${proxyPort}`); }); // 拦截并记录请求 proxy.onRequest((ctx, callback) => { const requestDetails = `Received request: ${ctx.clientToProxyRequest.method} ${ctx.clientToProxyRequest.headers.host}${ctx.clientToProxyRequest.url}\n`; console.log('Request intercepted:', requestDetails); fs.appendFile(logFilePath, requestDetails, (err) => { if (err) { console.error('Error writing to log file:', err); } }); return callback(); }); // 读取并信任CA证书 const caCertPath = path.join(certsDir, 'ca.pem'); try { const caCertData = fs.readFileSync(caCertPath); // 将CA证书导入Electron的根信任存储 await session.defaultSession.importCertificate({ data: caCertData, type: 'pem', origin: 'https://*' }); // 开发环境下可临时禁用证书校验(可选) session.defaultSession.setCertificateVerifyProc((request, callback) => { callback(0); // 0表示信任该证书 }); } catch (err) { console.error('Failed to load CA certificate:', err); } // 设置统一的代理规则 const proxyURL = `http=127.0.0.1:${proxyPort};https=127.0.0.1:${proxyPort}`; await session.defaultSession.setProxy({ proxyRules: proxyURL }); createWindow(); }); function createWindow() { const mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, contextIsolation: false, } }); // 测试HTTPS请求拦截 mainWindow.loadURL('https://example.com'); }
关键说明
- 端口统一:确保代理监听端口与Electron代理规则中的端口完全一致,避免请求丢失。
- 证书信任:通过
importCertificate将CA证书加入Electron信任列表,是规范的做法;若仍有问题,可临时用setCertificateVerifyProc跳过校验(仅开发环境使用)。 - 证书生成:首次启动代理时,http-mitm-proxy会自动在
certs目录生成CA证书,需确保该目录具备写入权限。
内容的提问来源于stack exchange,提问作者thierry henrich
相关产品推荐
相关产品推荐

