节点获取:禁用 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 });
我有以下代码,运行 来自快递服务器:
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 });