Node.js進(jìn)階之核心模塊https入門
模塊概覽
這個(gè)模塊的重要性,基本不用強(qiáng)調(diào)了。在網(wǎng)絡(luò)安全問題日益嚴(yán)峻的今天,網(wǎng)站采用HTTPS是個(gè)必然的趨勢(shì)。
在nodejs中,提供了 https 這個(gè)模塊來完成 HTTPS 相關(guān)功能。從官方文檔來看,跟 http 模塊用法非常相似。
本文主要包含兩部分:
- 通過客戶端、服務(wù)端的例子,對(duì)https模塊進(jìn)行入門講解。
- 如何訪問安全證書不受信任的網(wǎng)站。(以 12306 為例子)
篇幅所限,本文無法對(duì) HTTPS協(xié)議 及 相關(guān)技術(shù)體系 做過多講解,有問題歡迎留言交流。
客戶端例子
跟http模塊的用法非常像,只不過請(qǐng)求的地址是https協(xié)議的而已,代碼如下:
var https = require('https');
https.get('https://www.baidu.com', function(res){
console.log('status code: ' + res.statusCode);
console.log('headers: ' + res.headers);
res.on('data', function(data){
process.stdout.write(data);
});
}).on('error', function(err){
console.error(err);
});
服務(wù)端例子
對(duì)外提供HTTPS服務(wù),需要有HTTPS證書。如果你已經(jīng)有了HTTPS證書,那么可以跳過證書生成的環(huán)節(jié)。如果沒有,可以參考如下步驟
生成證書
1、創(chuàng)建個(gè)目錄存放證書。
mkdir cert cd cert
2、生成私鑰。
openssl genrsa -out chyingp-key.pem 2048
3、生成證書簽名請(qǐng)求(csr是 Certificate Signing Request的意思)。
openssl req -new \ -sha256 -key chyingp-key.key.pem \ -out chyingp-csr.pem \ -subj "/C=CN/ST=Guandong/L=Shenzhen/O=YH Inc/CN=www.chyingp.com"
4、生成證書。
openssl x509 \ -req -in chyingp-csr.pem \ -signkey chyingp-key.pem \ -out chyingp-cert.pem
HTTPS服務(wù)端
代碼如下:
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./cert/chyingp-key.pem'), // 私鑰
cert: fs.readFileSync('./cert/chyingp-cert.pem') // 證書
};
var server = https.createServer(options, function(req, res){
res.end('這是來自HTTPS服務(wù)器的返回');
});
server.listen(3000);
由于我并沒有 www.chyingp.com 這個(gè)域名,于是先配置本地host
127.0.0.1 www.chyingp.com
啟動(dòng)服務(wù),并在瀏覽器里訪問 http://www.chyingp.com:3000 。注意,瀏覽器會(huì)提示你證書不可靠,點(diǎn)擊 信任并繼續(xù)訪問 就行了。
進(jìn)階例子:訪問安全證書不受信任的網(wǎng)站
這里以我們最喜愛的12306最為例子。當(dāng)我們通過瀏覽器,訪問12306的購(gòu)票頁面 https://kyfw.12306.cn/otn/regist/init 時(shí),chrome會(huì)阻止我們?cè)L問,這是因?yàn)椋?2306的證書是自己頒發(fā)的,chrome無法確認(rèn)他的安全性。
對(duì)這種情況,可以有如下處理方式:
- 停止訪問:著急搶票回家過年的老鄉(xiāng)表示無法接受。
- 無視安全警告,繼續(xù)訪問:大部分情況下,瀏覽器是會(huì)放行的,不過安全提示還在。
- 導(dǎo)入12306的CA根證書:瀏覽器乖乖就范,認(rèn)為訪問是安全的。(實(shí)際上還是有安全提示,因?yàn)?2306用的簽名算法安全級(jí)別不夠)
例子:觸發(fā)安全限制
同樣的,通過 node https client 發(fā)起請(qǐng)求,也會(huì)遇到同樣問題。我們做下實(shí)驗(yàn),代碼如下:
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);
});
運(yùn)行上面代碼,得到下面的錯(cuò)誤提示,意思是 安全證書不可靠,拒絕繼續(xù)訪問。
{ 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:個(gè)人認(rèn)為這里的錯(cuò)誤提示有點(diǎn)誤導(dǎo)人,12306網(wǎng)站的證書并不是自簽名的,只是對(duì)證書簽名的CA是12306自家的,不在可信列表里而已。自簽名證書,跟自己CA簽名的證書還是不一樣的。
類似在瀏覽器里訪問,我們可以采取如下處理:
- 不建議:忽略安全警告,繼續(xù)訪問;
- 建議:將12306的CA加入受信列表;
方法1:忽略安全警告,繼續(xù)訪問
非常簡(jiǎn)單,將 rejectUnauthorized 設(shè)置為 false 就行,再次運(yùn)行代碼,就可以愉快的返回頁面了。
// 例子:忽略安全警告
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個(gè)步驟:
- 下載 12306 的CA證書
- 將der格式的CA證書,轉(zhuǎn)成pem格式
- 修改node https的配置
1、下載 12306 的CA證書
在12306的官網(wǎng)上,提供了CA證書的 下載地址 ,將它保存到本地,命名為 srca.cer。
2、將der格式的CA證書,轉(zhuǎn)成pem格式
https初始化client時(shí),提供了 ca 這個(gè)配置項(xiàng),可以將 12306 的CA證書添加進(jìn)去。當(dāng)你訪問 12306 的網(wǎng)站時(shí),client就會(huì)用ca配置項(xiàng)里的 ca 證書,對(duì)當(dāng)前的證書進(jìn)行校驗(yàn),于是就校驗(yàn)通過了。
需要注意的是,ca 配置項(xiàng)只支持 pem 格式,而從12306官網(wǎng)下載的是der格式的。需要轉(zhuǎn)換下格式才能用。關(guān)于 pem、der的區(qū)別,可參考 這里 。
openssl x509 -in srca.cer -inform der -outform pem -out srca.cer.pem
3、修改node https的配置
修改后的代碼如下,現(xiàn)在可以愉快的訪問12306了。
// 例子:將12306的CA證書,加入我們的信任列表里
var https = require('https');
var fs = require('fs');
var ca = fs.readFileSync('./srca.cer.pem');
var options = {
hostname: 'kyfw.12306.cn',
path: '/otn/leftTicket/init',
ca: [ ca ]
};
var req = https.get(options, function(res){
res.pipe(process.stdout);
});
req.on('error', function(err){
console.error(err.code);
});
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Node.js使用http模塊實(shí)現(xiàn)后臺(tái)服務(wù)器流程解析
- Node.js?搭建后端服務(wù)器內(nèi)置模塊(?http+url+querystring?的使用)
- Node.js基礎(chǔ)入門之path模塊,url模塊,http模塊使用詳解
- 基于Node.js的http模塊搭建HTTP服務(wù)器
- node.js使用http模塊創(chuàng)建服務(wù)器和客戶端完整示例
- node.js中http模塊和url模塊的簡(jiǎn)單介紹
- node.js 核心http模塊,起一個(gè)服務(wù)器,返回一個(gè)頁面的實(shí)例
- Node.js中Request模塊處理HTTP協(xié)議請(qǐng)求的基本使用教程
- Node.js 中 http 模塊的深度剖析與實(shí)戰(zhàn)應(yīng)用小結(jié)
相關(guān)文章
對(duì)mac下nodejs 更新到最新版本的最新方法(推薦)
今天小編就為大家分享一篇對(duì)mac下nodejs 更新到最新版本的最新方法(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
node.js 利用流實(shí)現(xiàn)讀寫同步,邊讀邊寫的方法
下面小編就為大家?guī)硪黄猲ode.js 利用流實(shí)現(xiàn)讀寫同步,邊讀邊寫的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
Nodejs?連接?mysql時(shí)報(bào)Error:?Cannot?enqueue?Query?after?fa
這篇文章主要介紹了Nodejs?連接?mysql時(shí)報(bào)Error:?Cannot?enqueue?Query?after?fatal?error錯(cuò)誤的處理辦法,需要的朋友可以參考下2023-05-05

