用https.request忽略node.js中无效的自签名ssl证书?
我正在一个小应用程序login到我的本地无线路由器(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/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”?
便宜又不安全的答案:
加
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
在调用https.request()
之前,
在这个问题中,一个更安全的方法(上面的解决scheme使整个节点进程不安全)得到了回答
在您的请求选项中,尝试包括以下内容:
var req = https.request({ host: '192.168.1.1', port: 443, path: '/', method: 'GET', rejectUnauthorized: false, requestCert: true, agent: false },
添加以下环境variables:
NODE_TLS_REJECT_UNAUTHORIZED=0
例如与export
:
export NODE_TLS_REJECT_UNAUTHORIZED=0
(非常感谢胡安拉)
不要相信所有试图误导你的人。 在您的请求中,只需添加:
ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]
如果你打开未经授权的证书,你将不会受到任何保护,没有ssl的工作也不会有太大的区别。 解决scheme是指定您期望的证书,如下一个片段所示。 确保证书的通用名称与您在请求中调用的地址相同(正如在主机中指定的那样):您将得到的是:
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答案:
添加以下环境variables:
NODE_TLS_REJECT_UNAUTHORIZED = 0例如与导出:
导出NODE_TLS_REJECT_UNAUTHORIZED = 0(非常感谢胡安)
如果你在windows上使用:
set NODE_TLS_REJECT_UNAUTHORIZED=0
感谢:@ weagle08
对于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); });
或者您可以尝试添加本地名称parsing(在大多数操作系统中的目录中findhosts
文件,细节不同),如下所示:
192.168.1.1 Linksys
和下一个
var req = https.request({ host: 'Linksys', port: 443, path: '/', method: 'GET' ...
将工作。