节点获取:禁用 SSL 验证

Node-fetch: Disable SSL verification

我有以下代码,运行 来自快递服务器:

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
 });

当我 运行 代码时,我得到以下错误,尽管能够 运行 Postman 中的请求没有问题。

{"message":"request to https://external-login-api.com failed, reason: write EPROTO 7316:error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small:openssl\ssl\statem\statem_clnt.c:1472:\n","type":"system","errno":"EPROTO","code":"EPROTO"}

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

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

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

如果这是您托管的服务,您应该考虑更正和改进您的 TLS/SSL 密码。 .

重要的部分是:

You should use 2048-bit Diffie-Hellman groups or larger. You should not be using 512-bit or 1024-bit Diffie-Hellman groups.

如果这是第三方服务,您应该考虑联系他们或使用不同的服务,因为他们对 Logjam attack 持开放态度,这也在上面链接的答案中进行了讨论。

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

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,
    });

如果您想在使用 AXIOS 库时禁用 SSL 检查,请通过这种方式将代理添加到其调用中

// At instance level
const instance = axios.create({
  httpsAgent: new https.Agent({  
    rejectUnauthorized: false
  })
});

instance.get('https://something.com/foo');

// At request level
 const agent = new https.Agent({  
 rejectUnauthorized: false
});

axios.get('https://something.com/foo', { httpsAgent: agent });