我正在开发一个登录本地无线路由器 (Linksys) 的小应用程序,但我遇到了路由器自签名 ssl 证书的问题。
我运行 wget 192.168.1.1 并得到:
ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/[email protected]':
Self-signed certificate encountered.
ERROR: certificate common name `Linksys' doesn't match requested host name `192.168.1.1'.
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'.
在节点中,捕获的错误是:
{ [Error: socket hang up] code: 'ECONNRESET' }
我当前的示例代码是:
var req = https.request({
host: '192.168.1.1',
port: 443,
path: '/',
method: 'GET'
}, function(res){
var body = [];
res.on('data', function(data){
body.push(data);
});
res.on('end', function(){
console.log( body.join('') );
});
});
req.end();
req.on('error', function(err){
console.log(err);
});
我怎样才能让node.js做相当于“--no-check-certificate”的事情?
廉价且不安全的答案:
添加
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
在代码中,在调用之前
https.request()
更安全的方式(上面的解决方案使整个节点进程不安全)在这个问题
得到了解答在您的请求选项中,尝试包含以下内容:
var req = https.request({
host: '192.168.1.1',
port: 443,
path: '/',
method: 'GET',
rejectUnauthorized: false,
requestCert: true,
agent: false
},
添加以下环境变量:
NODE_TLS_REJECT_UNAUTHORIZED=0
例如与
export
:
export NODE_TLS_REJECT_UNAUTHORIZED=0
(非常感谢胡安拉)
不要相信所有试图误导您的人。
在您的请求中,只需添加:
ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]
如果您打开未经授权的证书,您将根本不会受到保护(因未验证身份而暴露于 MITM),并且在没有 SSL 的情况下工作不会有太大区别。解决方案是指定您期望的 CA 证书,如下一个代码片段所示。确保证书的通用名称与您在请求中调用的地址相同(如主机中指定):
您将得到的是:
var req = https.request({
host: '192.168.1.1',
port: 443,
path: '/',
ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
method: 'GET',
rejectUnauthorized: true,
requestCert: true,
agent: false
},
请阅读这篇文章(披露:此答案作者撰写的博客文章)以了解:
添加@Armand 答案:
添加以下环境变量:
NODE_TLS_REJECT_UNAUTHORIZED=0 例如有出口:
导出 NODE_TLS_REJECT_UNAUTHORIZED=0(非常感谢 Juanra)
如果您使用Windows:
set NODE_TLS_REJECT_UNAUTHORIZED=0
您还可以使用默认选项创建请求实例:
require('request').defaults({ rejectUnauthorized: false })
所以,我的公司刚刚切换到 Node.js v12.x。 我正在使用
NODE_TLS_REJECT_UNAUTHORIZED
,但它停止工作了。
经过一番挖掘,我开始使用 NODE_EXTRA_CA_CERTS=A_FILE_IN_OUR_PROJECT
,它具有我们自签名证书的 PEM 格式,并且我的所有脚本都再次运行。
因此,如果您的项目有自签名证书,也许这个环境变量会对您有所帮助。
参考:https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file
尝试 导出 NODE_TLS_REJECT_UNAUTHORIZED=0
对于meteorJS,你可以使用npmRequestOptions进行设置。
HTTP.post(url, {
npmRequestOptions: {
rejectUnauthorized: false // TODO remove when deploy
},
timeout: 30000, // 30s
data: xml
}, function(error, result) {
console.log('error: ' + error);
console.log('resultXml: ' + result);
});
如果您正在寻找使用 @nestjs/axios 发帖,
这是没有证书的语法(非生产解决方案):
const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')
const config = {
headers: {
'Content-Type': 'application/json',
Authorization: `Basic ${token}`,
},
httpsAgent: new https.Agent({
rejectUnauthorized: false
}),
};
const responseData = await firstValueFrom(
this.httpService.post(url, data, config).pipe(map((response) => response.data)),
);
这是带有证书的语法(生产解决方案):
const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')
const config = {
headers: {
'Content-Type': 'application/json',
Authorization: `Basic ${token}`,
},
httpsAgent: new https.Agent({
rejectUnauthorized: true,
ca: fs.readFileSync(path.join(__dirname, './resources/certificateName'))
}),
};
const responseData = await firstValueFrom(
this.httpService.post(url, data, config).pipe(map((response) => response.data)),
);
或者您可以尝试添加本地名称解析(在大多数操作系统中,在目录
hosts
中找到 etc
文件,详细信息有所不同),如下所示:
192.168.1.1 Linksys
还有下一个
var req = https.request({
host: 'Linksys',
port: 443,
path: '/',
method: 'GET'
...
会起作用的。
使用包时,有时您无法选择在
request
调用上设置正确的设置,该包也不为您提供注入 request
的方法。
但是,您可能仍然希望避免不安全的
NODE_TLS_REJECT_UNAUTHORIZED=0
并选择仅与指定目标建立不安全的连接。
这就是我解决问题的方法:
// check if host and port fit your application
function isSelf(host, port) {
return host === myHost && port === myPort;
}
// get the built in tls module and overwrite the default connect behavior
const tls = require("tls");
const _connect = tls.connect;
function wrappedConnect(options, secureConnectListener) {
if (isSelf(options.host, options.port)) {
options.rejectUnauthorized = false;
}
return _connect(options, secureConnectListener);
}
tls.connect = wrappedConnect;
如果您使用“aws-sdk”,请像这样更新您的端点配置
const endpoint = new AWS.Endpoint(ELASTICSEARCH_DOMAIN, {
sslEnabled: false, // this is to off ssl
});
const request = new AWS.HttpRequest(endpoint, AWS_REGION);
文档没有太大帮助,即使这里有链接https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#sslEnabled-property 我希望这对你有用
对于那些使用 Visual Studio Code 并且不想在 .env 文件中冒险设置
NODE_TLS_REJECT_UNAUTHORIZED=0
的人,我有一个提示:
.vscode/settings.json
, "jest.nodeEnv": {
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}