节点提取:禁用SSL验证

All*_*ian 4 node.js node-fetch

我有以下代码,这些代码是从快递服务器运行的:

import fetch from 'node-fetch';

let formBody = [];

const dataLogin = {
      'username': 'myUser',
      'password': 'myPassword'
};

for (let p in dataLogin) {
   let encodedKey = encodeURIComponent(p);
   let encodedValue = encodeURIComponent(dataLogin[p]);
   formBody.push(encodedKey + "=" + encodedValue);
 }

 formBody = formBody.join("&");   

 const url = 'https://external-login-api.com';
 return fetch(url, {
          method: 'POST',
          headers: {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Content-Length': formBody.length         
  },     
  body: formBody
 });
Run Code Online (Sandbox Code Playgroud)

运行代码时,尽管能够在Postman中运行请求而没有问题,但仍收到以下错误。

{“消息”:“对https://external-login-api.com的请求失败,原因:编写EPROTO 7316:错误:141A318A:SSL例程:tls_process_ske_dhe:dh密钥太小:openssl \ ssl \ statem \ statem_clnt.c :1472:\ n“,”类型“:”系统“,” errno“:” EPROTO“,”代码“:” EPROTO“}

如何为此请求禁用SSL验证?

小智 51

另一种方法是将您自己的代理设置为 fetch 调用。

const fetch = require('node-fetch');
const https = require('https');

const httpsAgent = new https.Agent({
      rejectUnauthorized: false,
    });

const response = await fetch(url, {
      method: 'POST',
      headers: headers,
      body: body,
      agent: httpsAgent,
    });
Run Code Online (Sandbox Code Playgroud)

  • 这是一种更好的方法(如果您想要禁用节点获取的 SSL 验证),因为它仅将禁令解除限制在您需要的情况下(例如一次性内部查询),同时仍然验证其他节点的证书连接(如第三方服务) (9认同)
  • 不适用于带有 build-it fetch 的 Node18 (8认同)
  • 我只是在我的 https 本地主机服务器上运行一个一次性脚本,这正是我所需要的。谢谢。 (2认同)

Ell*_*urn 10

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
Run Code Online (Sandbox Code Playgroud)

将确保您忽略任何拒绝的TLS证书,或者可以在运行节点服务时将其设置为环境变量。但是,这可能无济于事,并且可能是一个坏主意。SSL错误不是因为证书无效(例如,自签名证书),而是因为SSL / TLS配置中的Diffie-Hellman密钥弱。

如果您托管此服务,则应研究纠正和改进TLS / SSL密码。有关更多信息,请参见此答案

重要的部分是:

您应该使用2048位Diffie-Hellman组或更大的组。您不应使用512位或1024位Diffie-Hellman组。

如果这是第三方服务,则应考虑与他们联系或使用其他服务,因为它们会使自己容易遭受Logjam攻击,在上面的链接中也对此进行了讨论。

  • 我在公司网络上,几乎所有内容都被阻止。这个答案救了我的命。 (2认同)
  • @OldGeezer 我已经好几年没有真正接触过nodejs了,但我很好奇所以就去寻找了。Node v18 中的 Fetch 由 undici 模块处理,该模块现在已捆绑到 Nodejs 核心中。据我所知,这是对 http 处理的完全重写。因此,它不使用旧的节点 tls 堆栈,因此您需要单独传递它。禁用 tls 验证的文档位于:https://undici.nodejs.org/#/docs/best-practices/client-certificate。 (2认同)