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

Electron调用ngrok托管API时出现ERR_SSL_BAD_DECRYPT错误求助

问题分析与解决方案

问题核心

你开发的Electron应用调用ngrok暴露的NodeJS API发送WhatsApp消息时,本地测试正常,但使用ngrok链接后,发送大量号码会在5分钟左右触发ERR_SSL_BAD_DECRYPT错误导致崩溃,而API本身仍能继续处理消息。这是因为ngrok免费版默认SSL/TLS会话超时为5分钟,Electron的axios请求保持长连接超过该时间后,ngrok终止会话引发解密失败。

可行解决方案

1. 禁用axios长连接

强制axios每次请求后关闭连接,避免触发ngrok的会话超时:
修改Electron中的axios请求配置,添加Connection: close头:

ipcMain.handle("sendMessage", async (event, messageData) => {
    try {
        const response = await axios.post(url + "/whatsapp/send", messageData, {
            headers: { 
                Authorization: `Bearer ${global.authToken}`,
                Connection: 'close' // 新增:关闭长连接
            },
        });
        return response.data;
    } catch (error) {
        console.error(
            "Mensagem de erro:",
            error.response ? error.response.data : error.message
        );
        throw error;
    }
});

或者创建全局axios实例并设置默认头:

const axiosInstance = axios.create({
    headers: {
        Connection: 'close'
    }
});
// 之后用axiosInstance.post代替axios.post

2. 拆分批量请求

将大批次号码拆分为多个小批次,确保单个API请求的处理时间不超过5分钟:
比如原来一次性发送10个号码(总耗时300-600秒),改为每次发送2个号码,Electron分多次调用API:

// Electron端拆分逻辑示例
ipcMain.handle("sendBulkMessage", async (event, { numbers, message }) => {
    const batchSize = 2;
    const results = [];
    for (let i = 0; i < numbers.length; i += batchSize) {
        const batch = numbers.slice(i, i + batchSize);
        try {
            const res = await axios.post(url + "/whatsapp/send", { to: batch, message }, {
                headers: { 
                    Authorization: `Bearer ${global.authToken}`,
                    Connection: 'close'
                },
            });
            results.push(res.data);
            // 批次间可加短延迟,避免频繁请求
            await new Promise(resolve => setTimeout(resolve, 1000));
        } catch (err) {
            console.error("批次发送失败:", err);
            results.push({ error: err.message });
        }
    }
    return results;
});

同时API端无需修改,保持原有逻辑即可。

3. 针对axios配置SSL证书忽略(补充方案)

如果证书问题仍存在,直接为axios配置自定义HTTPS代理,强制忽略证书验证(比全局环境变量更可靠):

const https = require('https');
const sslAgent = new https.Agent({
    rejectUnauthorized: false // 忽略证书验证
});

ipcMain.handle("sendMessage", async (event, messageData) => {
    try {
        const response = await axios.post(url + "/whatsapp/send", messageData, {
            headers: { Authorization: `Bearer ${global.authToken}` },
            httpsAgent: sslAgent // 应用自定义代理
        });
        return response.data;
    } catch (error) {
        console.error(
            "Mensagem de erro:",
            error.response ? error.response.data : error.message
        );
        throw error;
    }
});

4. 升级ngrok(备选)

如果使用ngrok付费版,可以调整SSL会话超时时间(最长可达1小时),避免超时问题,但免费版无法修改此配置。

关键说明

  • 你遇到的5分钟崩溃是ngrok免费版的硬限制,长连接超过这个时间会被强制终止,引发SSL解密错误。
  • API本身不受影响是因为它在后台异步处理消息,与Electron的HTTP连接状态无关。

内容的提问来源于stack exchange,提问作者João

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:23:19