我正在开发一个登录本地无线路由器(Linksys)的小应用程序,但我遇到了路由器自签名证书的问题。
我运行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/emailAddress=support@linksys.com':
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”?
答案 0 :(得分:497)
廉价且不安全的回答:
添加
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
在调用https.request()
之前,在代码中中回答了一种更安全的方式(上述解决方案使整个节点流程不安全)
答案 1 :(得分:140)
在您的请求选项中,请尝试包含以下内容:
var req = https.request({
host: '192.168.1.1',
port: 443,
path: '/',
method: 'GET',
rejectUnauthorized: false,
requestCert: true,
agent: false
},
答案 2 :(得分:48)
不要相信所有试图误导你的人。
在您的请求中,只需添加:
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
},
请阅读this article(披露:此答案的作者撰写的博客文章),以便了解:
答案 3 :(得分:41)
添加以下环境变量:
NODE_TLS_REJECT_UNAUTHORIZED=0
e.g。与export
:
export NODE_TLS_REJECT_UNAUTHORIZED=0
(非常感谢Juanra)
答案 4 :(得分:12)
添加@Armand回答:
添加以下环境变量:
NODE_TLS_REJECT_UNAUTHORIZED = 0,例如与出口:
导出NODE_TLS_REJECT_UNAUTHORIZED = 0(非常感谢Juanra)
如果您使用Windows:
set NODE_TLS_REJECT_UNAUTHORIZED=0
答案 5 :(得分:7)
您还可以使用默认选项创建请求实例:
require('request').defaults({ rejectUnauthorized: false })
答案 6 :(得分:3)
对于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);
});
答案 7 :(得分:1)
或者您可以尝试在大多数操作系统中添加本地名称解析(在hosts
目录中找到etc
文件,详细信息有所不同),如下所示:
192.168.1.1 Linksys
和下一个
var req = https.request({
host: 'Linksys',
port: 443,
path: '/',
method: 'GET'
...
会奏效。
答案 8 :(得分:0)
因此,我的公司刚刚切换到Node.jsv12.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
答案 9 :(得分:-1)
尝试 导出NODE_TLS_REJECT_UNAUTHORIZED = 0