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
相关产品推荐
相关产品推荐

