猿问

使用https.request忽略node.js中无效的自签名ssl证书?

我正在开发一个登录我本地无线路由器(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”的操作?


呼如林
浏览 2741回答 3
3回答

冉冉说

在您的请求选项中,请尝试包含以下内容:   var req = https.request({       host: '192.168.1.1',       port: 443,      path: '/',      method: 'GET',      rejectUnauthorized: false,      requestCert: true,      agent: false    },

慕森王

不要相信所有试图误导你的人。在您的请求中,只需添加: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 Certs以便轻松进行测试以模拟生产环境
随时随地看视频慕课网APP
我要回答