最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js進階之核心模塊https入門

 更新時間:2018年05月23日 09:12:13   作者:程序猿小卡的博客  
在nodejs中,提供了 https 這個模塊來完成 HTTPS 相關(guān)功能。這篇文章主要介紹了Node.js進階之核心模塊https入門,具有一定的參考價值,感興趣的小伙伴們可以參考一下

模塊概覽

這個模塊的重要性,基本不用強調(diào)了。在網(wǎng)絡(luò)安全問題日益嚴峻的今天,網(wǎng)站采用HTTPS是個必然的趨勢。

在nodejs中,提供了 https 這個模塊來完成 HTTPS 相關(guān)功能。從官方文檔來看,跟 http 模塊用法非常相似。

本文主要包含兩部分:

  1. 通過客戶端、服務(wù)端的例子,對https模塊進行入門講解。
  2. 如何訪問安全證書不受信任的網(wǎng)站。(以 12306 為例子)

篇幅所限,本文無法對 HTTPS協(xié)議 及 相關(guān)技術(shù)體系 做過多講解,有問題歡迎留言交流。

客戶端例子

跟http模塊的用法非常像,只不過請求的地址是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ù)端例子

對外提供HTTPS服務(wù),需要有HTTPS證書。如果你已經(jīng)有了HTTPS證書,那么可以跳過證書生成的環(huán)節(jié)。如果沒有,可以參考如下步驟

生成證書

1、創(chuàng)建個目錄存放證書。

mkdir cert
cd cert

2、生成私鑰。

openssl genrsa -out chyingp-key.pem 2048

3、生成證書簽名請求(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 這個域名,于是先配置本地host

127.0.0.1 www.chyingp.com

啟動服務(wù),并在瀏覽器里訪問 http://www.chyingp.com:3000 。注意,瀏覽器會提示你證書不可靠,點擊 信任并繼續(xù)訪問 就行了。

進階例子:訪問安全證書不受信任的網(wǎng)站

這里以我們最喜愛的12306最為例子。當我們通過瀏覽器,訪問12306的購票頁面 https://kyfw.12306.cn/otn/regist/init 時,chrome會阻止我們訪問,這是因為,12306的證書是自己頒發(fā)的,chrome無法確認他的安全性。

對這種情況,可以有如下處理方式:

  1. 停止訪問:著急搶票回家過年的老鄉(xiāng)表示無法接受。
  2. 無視安全警告,繼續(xù)訪問:大部分情況下,瀏覽器是會放行的,不過安全提示還在。
  3. 導入12306的CA根證書:瀏覽器乖乖就范,認為訪問是安全的。(實際上還是有安全提示,因為12306用的簽名算法安全級別不夠)

例子:觸發(fā)安全限制

同樣的,通過 node https client 發(fā)起請求,也會遇到同樣問題。我們做下實驗,代碼如下:

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);
});

運行上面代碼,得到下面的錯誤提示,意思是 安全證書不可靠,拒絕繼續(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:個人認為這里的錯誤提示有點誤導人,12306網(wǎng)站的證書并不是自簽名的,只是對證書簽名的CA是12306自家的,不在可信列表里而已。自簽名證書,跟自己CA簽名的證書還是不一樣的。

類似在瀏覽器里訪問,我們可以采取如下處理:

  1. 不建議:忽略安全警告,繼續(xù)訪問;
  2. 建議:將12306的CA加入受信列表;

方法1:忽略安全警告,繼續(xù)訪問

非常簡單,將 rejectUnauthorized 設(shè)置為 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個步驟:

  1. 下載 12306 的CA證書
  2. 將der格式的CA證書,轉(zhuǎn)成pem格式
  3. 修改node https的配置

1、下載 12306 的CA證書

在12306的官網(wǎng)上,提供了CA證書的 下載地址 ,將它保存到本地,命名為 srca.cer。

2、將der格式的CA證書,轉(zhuǎn)成pem格式

https初始化client時,提供了 ca 這個配置項,可以將 12306 的CA證書添加進去。當你訪問 12306 的網(wǎng)站時,client就會用ca配置項里的 ca 證書,對當前的證書進行校驗,于是就校驗通過了。

需要注意的是,ca 配置項只支持 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);
});

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • node.js實現(xiàn)上傳文件功能

    node.js實現(xiàn)上傳文件功能

    這篇文章主要為大家詳細介紹了node.js實現(xiàn)上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 基于 Node.js 實現(xiàn)前后端分離

    基于 Node.js 實現(xiàn)前后端分離

    為了解決傳統(tǒng)Web開發(fā)模式帶來的各種問題,我們進行了許多嘗試,但由于前/后端的物理鴻溝,嘗試的方案都大同小異。痛定思痛,今天我們重新思考了“前后端”的定義,引入前端同學都熟悉的NodeJS,試圖探索一條全新的前后端分離模式。
    2016-04-04
  • node.js中的Socket.IO使用實例

    node.js中的Socket.IO使用實例

    這篇文章主要介紹了node.js中的Socket.IO使用實例,本文講解了Socket.IO的安裝、結(jié)合express來構(gòu)建服務(wù)器、基本使用方法及一個網(wǎng)絡(luò)聊天室的完整案例,需要的朋友可以參考下
    2014-11-11
  • 詳解Node.JS模塊 process

    詳解Node.JS模塊 process

    這篇文章主要介紹了Node.JS模塊 process的相關(guān)資料,幫助大家更好的理解和學習node.js,感興趣的朋友可以了解下
    2020-08-08
  • 使用C++為node.js寫擴展模塊

    使用C++為node.js寫擴展模塊

    本文給大家介紹的是在window7下使用C++來給node.js編寫擴展模塊的方法,附上一個簡單的hello實例,有需要的小伙伴可以參考下。
    2015-04-04
  • 對mac下nodejs 更新到最新版本的最新方法(推薦)

    對mac下nodejs 更新到最新版本的最新方法(推薦)

    今天小編就為大家分享一篇對mac下nodejs 更新到最新版本的最新方法(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Nodejs監(jiān)聽日志文件的變化的過程解析

    Nodejs監(jiān)聽日志文件的變化的過程解析

    最近有在做日志文件的分析,其中有一個需求:A服務(wù)器項目需要用Nodejs監(jiān)聽日志文件的變化,當項目產(chǎn)生了新的日志信息,將新的部分通過socket傳輸?shù)紹服務(wù)器項目,本文重點給大家介紹Nodejs監(jiān)聽日志文件的變化的相關(guān)知識,一起看看吧
    2019-08-08
  • node.js 利用流實現(xiàn)讀寫同步,邊讀邊寫的方法

    node.js 利用流實現(xiàn)讀寫同步,邊讀邊寫的方法

    下面小編就為大家?guī)硪黄猲ode.js 利用流實現(xiàn)讀寫同步,邊讀邊寫的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Node文件操作匯總實例詳解

    Node文件操作匯總實例詳解

    這篇文章主要為大家介紹了Node文件操作匯總實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Nodejs?連接?mysql時報Error:?Cannot?enqueue?Query?after?fatal?error錯誤的處理辦法

    Nodejs?連接?mysql時報Error:?Cannot?enqueue?Query?after?fa

    這篇文章主要介紹了Nodejs?連接?mysql時報Error:?Cannot?enqueue?Query?after?fatal?error錯誤的處理辦法,需要的朋友可以參考下
    2023-05-05

最新評論

嘉荫县| 芦山县| 平乡县| 宜川县| 麻栗坡县| 新竹县| 柳州市| 乃东县| 富阳市| 南部县| 平度市| 宁武县| 平潭县| 延长县| 古浪县| 东海县| 长沙县| 渝北区| 论坛| 扶余县| 宿松县| 孟州市| 西平县| 湟中县| 松桃| 屏东县| 榆社县| 克山县| 林口县| 喀喇沁旗| 高州市| 裕民县| 岗巴县| 鹤庆县| 福泉市| 鹿邑县| 桦甸市| 金秀| 南川市| 宜宾县| 大同县|