Node.js进阶之核心模块https入门

2020-06-17 05:35:57易采站长站整理

这里以我们最喜爱的12306最为例子。当我们通过浏览器,访问12306的购票页面 https://kyfw.12306.cn/otn/regist/init 时,chrome会阻止我们访问,这是因为,12306的证书是自己颁发的,chrome无法确认他的安全性。

对这种情况,可以有如下处理方式:

停止访问:着急抢票回家过年的老乡表示无法接受。
无视安全警告,继续访问:大部分情况下,浏览器是会放行的,不过安全提示还在。
导入12306的CA根证书:浏览器乖乖就范,认为访问是安全的。(实际上还是有安全提示,因为12306用的签名算法安全级别不够)

例子:触发安全限制

同样的,通过 node https client 发起请求,也会遇到同样问题。我们做下实验,代码如下:


var https = require('https');

https.get('https://kyfw.12306.cn/otn/regist/init', function(res){
res.on('data', function(data){
process.stdout.write(data);
});
}).on('error', function(err){
console.error(err);
});

运行上面代码,得到下面的错误提示,意思是 安全证书不可靠,拒绝继续访问。

{ Error: self signed certificate in certificate chain
    at Error (native)
    at TLSSocket.<anonymous> (_tls_wrap.js:1055:38)
    at emitNone (events.js:86:13)
    at TLSSocket.emit (events.js:185:7)
    at TLSSocket._finishInit (_tls_wrap.js:580:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:412:38) code: ‘SELF_SIGNED_CERT_IN_CHAIN’ }

ps:个人认为这里的错误提示有点误导人,12306网站的证书并不是自签名的,只是对证书签名的CA是12306自家的,不在可信列表里而已。自签名证书,跟自己CA签名的证书还是不一样的。

类似在浏览器里访问,我们可以采取如下处理:

不建议:忽略安全警告,继续访问;
建议:将12306的CA加入受信列表;

方法1:忽略安全警告,继续访问

非常简单,将 rejectUnauthorized 设置为 false 就行,再次运行代码,就可以愉快的返回页面了。


// 例子:忽略安全警告
var https = require('https');
var fs = require('fs');

var options = {
hostname: 'kyfw.12306.cn',
path: '/otn/leftTicket/init',
rejectUnauthorized: false // 忽略安全警告
};

var req = https.get(options, function(res){
res.pipe(process.stdout);
});

req.on('error', function(err){
console.error(err.code);
});

方法2:将12306的CA加入受信列表

这里包含3个步骤:

下载 12306 的CA证书
将der格式的CA证书,转成pem格式