当前位置: 首页 > 后端技术 > Node.js

Nodejs进阶:核心模块如何优雅访问12306

时间:2023-04-03 15:20:50 Node.js

欢迎进群交流,群号197339705。模块概述这个模块的重要性基本不用强调。在网络安全问题日益严峻的今天,网站采用HTTPS是必然趋势。在nodejs中,提供了https模块来完成HTTPS的相关功能。从官方文档看,和http模块的用法很相似。本文主要包括两个部分:通过客户端和服务端的例子介绍https模块。如何访问具有不受信任的安全证书的网站。(以12306为例)限于篇幅,本文无法对HTTPS协议及相关技术体系进行过多的讲解。有问题欢迎留言交流。客户端示例与http模块的用法非常相似,只是请求的地址是https协议下的。代码如下:varhttps=require('https');https.get('https://www.baidu.com',function(res){console.log('状态码:'+res.statusCode);console.log('headers:'+res.headers);res.on('data',function(data){process.stdout.write(data);});}).on('error',函数(错误){console.error(错误);});服务器示例对外提供HTTPS服务,需要HTTPS证书。如果您已经拥有HTTPS证书,则可以跳过证书生成过程。如果没有,可以参考以下步骤生成证书1.创建一个目录来存放证书。mkdircertcdcert2,生成私钥。opensslgenrsa-outchyingp-key.pem20483。生成证书签名请求(csr表示证书签名请求)。opensslreq-new\-sha256-keychyingp-key.key.pem\-outchyingp-csr.pem\-subj"/C=CN/ST=Guandong/L=Shenzhen/O=YHInc/CN=www.chyingp.com”4.生成证书。opensslx509\-req-inchyingp-csr.pem\-signkeychyingp-key.pem\-outchyingp-cert.pemHTTPS服务器代码如下:varhttps=require('https');varfs=require('fs');varoptions={key:fs.readFileSync('./cert/chyingp-key.pem'),//私钥cert:fs.readFileSync('./cert/chyingp-cert.pem')//Certificate};varserver=https.createServer(options,function(req,res){res.end('这是HTTPS服务器返回的');});server.listen(3000);因为我不知道'没有www。域名chyingp.com,所以首先配置本地host127.0.0.1www.chyingp.com启动服务,在浏览器中访问http://www.chyingp.com:3000。注意浏览器会提示证书不可靠,点击信任继续访问即可。进阶范例:访问安全证书不受信任的网站这里我们以我们最喜欢的12306为例。当我们通过浏览器访问12306的购票页面https://kyfw.12306.cn/otn/reg...时,chrome会阻止我们访问,因为12306的证书是自己颁发的,chrome无法确认他的安全。对于这种情况,有以下几种处理方式:停止拜访:急着抢票回家过年的老乡们表示不能接受。忽略安全警告继续访问:大多数情况下,浏览器会允许,但安全提示依然存在。导入12306的CA根证书:浏览器乖乖提交,认为访问安全。(其实还是有安全提醒的,因为12306使用的签名算法不够安全。)例子:触发安全限制同理,如果通过节点https客户端发起请求,也会遇到同样的问题。我们来做个实验,代码如下:varhttps=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);});运行上面的代码,得到如下错误信息,表示安全证书不可靠,访问被拒绝。{错误:证书链中的自签名证书在TLSSocket处出现错误(本机)。(_tls_wrap.js:1055:38)atemitNone(events.js:86:13)atTLSSocket.emit(events.js:185):7)atTLSSocket._finishInit(_tls_wrap.js:580:8)atTLSWrap.ssl.onhandshakedone(_tls_wrap.js:412:38)code:'SELF_SIGNED_CERT_IN_CHAIN'}ps:个人认为这里的错误信息有点误导,12306网站的证书不是自签的,但是签发证书的CA是12306自己的,不在信任列表中。自签名证书与您自己的CA签名的证书不同。类似于在浏览器中访问,我们可以采取以下措施:不推荐:忽略安全警告继续访问;建议:将12306的CA加入信任列表;方法一:忽略安全警告继续访问很简单,设置rejectUnauthorized为false即可,再次运行代码,就可以愉快的返回页面了。//示例:忽略安全警告varhttps=require('https');varfs=require('fs');varoptions={hostname:'kyfw.12306.cn',path:'/otn/leftTicket/init',rejectUnauthorized:false//忽略安全警告};varreq=https.get(options,function(res){res.pipe(process.stdout);});req.on('error',function(err){console.error(err.code);});方法二:将12306的CA加入信任列表。这里有3个步骤:下载12306的CA证书,将der格式的CA证书转为pem格式,修改节点https的配置1.下载12306的CA证书在12306官网,CA的下载地址提供证书,保存在本地,命名为srca.cer。2、初始化客户端时将der格式的CA证书转换成pem格式的https时,提供了配置项ca,可以在其中添加12306的CA证书。当你访问12306的网站时,客户端会使用ca配置项中的ca证书来验证当前的证书,所以验证通过。需要注意的是ca配置项只支持pem格式,而12306官网下载的是der格式。需要转换格式才能使用。pem和der的区别可以参考这里。opensslx509-insrca.cer-informder-outformpem-outsrca.cer.pem3.修改nodehttps的配置修改后的代码如下,现在可以愉快的访问12306了。//示例:将12306的CA证书添加到我们的信任列表中varhttps=require('https');varfs=require('fs');varca=fs.readFileSync('./srca.cer.pem');varoptions={hostname:'kyfw.12306.cn',path:'/otn/leftTicket/init',ca:[ca]};varreq=https.get(options,function(res){res.pipe(process.stdout);});req.on('error',function(err){console.error(err.code);});相关链接为什么我的node.jsSSL连接无法连接?DERvs.CRTvs.CERvs.PEM证书以及如何转换它们PainlessSelfSignedCertificatesinnode.jsUsingOpenSSLtocreateaself-signedSSLcertificatememo(self-内置CA)OpenSSL和SSL数字证书概念贴自签名证书和私有CA签名证书的区别创建自签名证书创建私有CA证书类型证书扩展