39

我有以下代码,它是从快速服务器运行的:

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":"对https://external-login-api.com的请求失败,原因:写入 EPROTO 7316:error:141A318A:SSL 例程:tls_process_ske_dhe:dh 密钥太小:openssl\ssl\statem\statem_clnt.c :1472:\n","type":"system","errno":"EPROTO","code":"EPROTO"}

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

4

3 回答 3

71

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

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,
    });
于 2020-01-28T08:03:48.377 回答
59
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

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

如果这是您托管的服务,您应该考虑纠正和改进您的 TLS/SSL 密码。有关更多信息,请参阅此答案

重要的部分是:

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

如果这是第三方服务,您应该考虑联系他们或使用不同的服务,因为他们让自己容易受到Logjam 攻击,这也在上面链接的答案中进行了讨论。

于 2018-09-24T12:26:24.550 回答
-3

如果您想在使用 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 });

于 2020-07-20T14:02:31.873 回答