高速サーバーから実行される次のコードがあります。
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検証を無効にするにはどうすればよいですか?
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
拒否されたTLS証明書を無視するようにします。または、ノードサービスの実行時にこれを環境変数として設定できます。 ただし、これはおそらく役に立たず、おそらく悪い考えです。SSLエラーは、証明書が無効であるためではありません(自己署名証明書など)。しかし、SSL/TLS構成のDiffie-Hellmanキーが弱いためです。
これがホストしているサービスの場合は、TLS/SSL暗号の修正と改善を検討する必要があります。 詳細についてはこの回答を参照してください 。
重要な部分は次のとおりです。
2048ビット以上のDiffie-Hellmanグループを使用する必要があります。 512ビットまたは1024ビットのDiffie-Hellmanグループは使用しないでください。
これがサードパーティのサービスである場合は、それらに連絡するか、別のサービスを使用することを検討する必要があります。これは、上記の回答でも説明されている Logjam attack に開放されているためです。
もう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,
});