是否使用https.request忽略node.js中的无效自签名ssl证书?
我正在开发一个登录到本地无线路由器(Linksys)的小应用程序,但路由器的自签名ssl证书出现了问题 我运行了wget 192.168.1.1,得到:是否使用https.request忽略node.js中的无效自签名ssl证书?,node.js,https,ssl-certificate,Node.js,Https,Ssl Certificate,我正在开发一个登录到本地无线路由器(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-s
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在您的请求选项中执行与“无检查证书”等效的操作?,请尝试包括以下内容:
var req = https.request({
host: '192.168.1.1',
port: 443,
path: '/',
method: 'GET',
rejectUnauthorized: false,
requestCert: true,
agent: false
},
或者,您可以尝试添加本地名称解析(
hosts
在大多数操作系统的目录etc
中找到的文件,细节不同)如下所示:
192.168.1.1 Linksys
接下来呢
var req = https.request({
host: 'Linksys',
port: 443,
path: '/',
method: 'GET'
...
将起作用。廉价且不安全的回答: 加 在代码中,在调用
https.request()之前
一种更安全的方法(上面的解决方案使整个节点进程不安全)的答案是添加以下环境变量:
NODE_TLS_REJECT_UNAUTHORIZED=0
e、 g.使用导出:
export NODE_TLS_REJECT_UNAUTHORIZED=0
(非常感谢Juanra)对于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);
});
添加到@Armand-answer:
添加以下环境变量:
NODE_TLS_REJECT_UNAUTHORIZED=0
节点\u TLS\u拒绝\u未经授权=0,例如导出:
导出节点\u TLS\u拒绝\u UNAUTHORIZED=0(非常感谢Juanra)
如果您使用windows,请执行以下操作:
set 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
},
请在此阅读(披露:本答案作者撰写的博客文章),以了解:
- CA证书如何工作
- 如何生成CA证书以方便测试,从而模拟生产环境
您还可以使用默认选项创建请求实例:
require('request').defaults({ rejectUnauthorized: false })
试一试
导出NODE\u TLS\u REJECT\u UNAUTHORIZED=0所以,我的公司刚刚切换到NODE.js v12.x。
我正在使用节点\u TLS\u REJECT\u UNAUTHORIZED
,它停止了工作。
经过一番挖掘,我开始在我们的项目中使用NODE\u EXTRA\u CA\u CERTS=A\u FILE\u,该文件的PEM格式为我们的自签名证书,我的所有脚本都能正常工作
因此,如果您的项目具有自签名证书,那么这个环境变量可能会对您有所帮助
参考:为我工作。我使用restler,我发现默认情况下它没有转发选项,所以我不得不对它进行修补。创建options对象并设置代理:“options.agent=newhttps.agent(options);”然后只需调用'https.request(options)'好吧,这对我来说只需要rejectUnauthorized
选项就行了,什么都没有else@mcont我确认刚才的<代码>已经足够好了,其他一切都好了。在vs代码扩展中使用。更好的是允许PEM配置,我将在下一步这样做……没错,这可能会回答这个问题,但我认为在这种情况下,下一个错误将是DEPTH\u ZERO\u SELF\u SIGNED\u CERT。那么如何绕过DEPTH\u ZERO\u SELF\u SIGNED\u CERT呢?我现在遇到了这种情况。@reza:将此添加到您的选项中:rejectUnauthorized:false
我知道这有点旧,但为了便于将来参考(为了正确执行此操作),您需要获取自签名证书的PEM编码,并将其作为CA包含在选项中(您显然还需要设置代理值,但这可能是错误的)。由于证书是自签名的,因此它充当自己的CA,因此可以用于验证自身。但是,我还想问,在路由器上这样做是否真的值得,因为固件可能会被下载,因此私钥可能很容易被泄露。对我来说,这很有吸引力!我正确地放置了此代码在我将所有内容都包含在主应用程序js的顶部之后。这也适用于NodeJS和SailJS组合。我将其添加到local.js的顶部。请勿使用此或“拒绝未经授权”在生产环境中,因为这会禁用所有类型的安全检查。我在自我签名的https节点服务器上使用mocha运行测试时遇到问题,并在任何descripe块使我的测试通过之前立即添加该测试。这仅用于测试目的。您不应在生产中使用它。如answe中所述r、 这不是解决问题的最安全的方法这在尝试运行webdriver manager update
set NODE\u TLS\u REJECT\u UNAUTHORIZED=0 for windows时对我有效这对我的开发环境来说是一个很好的解决方案这是解决“错误:证书链中的自签名证书”问题的正确方法为什么要将fs.readFileSync放在括号内,而不是将其存储为字符串?Lelo:括号将其转换为数组。ca:需要一个证书数组。此文件应为逗号分隔的证书列表,通常人们使用内部函数将PEM文件转换为数组。对于自签名cet,单个证书“应”工作。感谢您,这对登录到Sweep时的“错误:无法获取本地颁发者证书”也有很大帮助