web-dev-qa-db-ja.com

ノードフェッチ:SSL検証を無効にする

高速サーバーから実行される次のコードがあります。

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でリクエストを問題なく実行できたにもかかわらず、次のエラーが発生します。

{"メッセージ": " 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検証を無効にするにはどうすればよいですか?

8
Allan Christian
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

拒否されたTLS証明書を無視するようにします。または、ノードサービスの実行時にこれを環境変数として設定できます。 ただし、これはおそらく役に立たず、おそらく悪い考えです。SSLエラーは、証明書が無効であるためではありません(自己署名証明書など)。しかし、SSL/TLS構成のDiffie-Hellmanキーが弱いためです。

これがホストしているサービスの場合は、TLS/SSL暗号の修正と改善を検討する必要があります。 詳細についてはこの回答を参照してください

重要な部分は次のとおりです。

2048ビット以上のDiffie-Hellmanグループを使用する必要があります。 512ビットまたは1024ビットのDiffie-Hellmanグループは使用しないでください。

これがサードパーティのサービスである場合は、それらに連絡するか、別のサービスを使用することを検討する必要があります。これは、上記の回答でも説明されている Logjam attack に開放されているためです。

16

もう1つの方法は、独自のエージェントをフェッチ呼び出しに設定することです。

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