You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:24:51