Node-網(wǎng)絡(luò)服務(wù)與安全

在網(wǎng)絡(luò)中,數(shù)據(jù)在服務(wù)器端和客戶端之間傳遞批旺,由于是明文幌陕,一旦被人監(jiān)控,數(shù)據(jù)就會(huì)泄漏汽煮。為此我們需要將數(shù)據(jù)加密后再進(jìn)行傳輸搏熄,但是對(duì)于應(yīng)用層協(xié)議而言棚唆,如HTTP、FTP等心例,仍希望能夠透明的處理數(shù)據(jù)宵凌,于是就有NetSpace提出了SSL(Secure Sockets Layer,安全套接層)契邀,它在傳輸層提供對(duì)網(wǎng)絡(luò)連接加密功能摆寄,對(duì)于應(yīng)用層而言他是透明的,數(shù)據(jù)在傳遞到應(yīng)用層之前就完成了加密和解密的過(guò)程坯门。最后IETF將其標(biāo)準(zhǔn)化,成為TLS(Transport Layer Security, 安全傳輸層協(xié)議)逗扒。

Node在網(wǎng)絡(luò)完全提供了3個(gè)模塊古戴,分別為crypto、tls矩肩、https现恼。crypto主要用于加密解密,SHA1黍檩、MD5等加密算法都在其中有體現(xiàn)叉袍,tls模塊提供了與net模塊類似的功能,區(qū)別在于它建立在TSL/SSL加密的TCP連接上刽酱,https模塊與http模塊接口一致喳逛,區(qū)別在于它建議在安全的連接之上。

TSL/SSL

TSL/SSL是一個(gè)公鑰/私鑰的結(jié)構(gòu)棵里,它是一個(gè)非對(duì)稱的結(jié)構(gòu)润文,每個(gè)服務(wù)器和客戶端都有自己的公私鑰,公鑰用來(lái)加密殿怜,私鑰用來(lái)解密典蝌,公私鑰是配對(duì)的,客戶端和服務(wù)端之間需要互換公鑰头谜,客戶端發(fā)送數(shù)據(jù)時(shí)要通過(guò)服務(wù)器的公鑰進(jìn)行加密骏掀,服務(wù)器端發(fā)送數(shù)據(jù)時(shí)則需要客戶端的公鑰進(jìn)行加密

Node在底層采用openssl實(shí)現(xiàn)TSL/SSL柱告,為此生成私鑰和公鑰可以通過(guò)openssl來(lái)完成截驮。

#  生成服務(wù)端私鑰
$ openssl genrsa -out server.key 1024
#  生成客戶端私鑰
$ openssl genrsa -out client.key 1024

上述命令生成兩個(gè)長(zhǎng)度為1024的RSA私鑰文件,我們可以繼續(xù)通過(guò)它生成公鑰:

$ openssl rsa -in server.key -pubout -out server.pem
$ openssl rsa -in client.key -pubout -out client.pem

公私鑰的非對(duì)稱加密雖好末荐,但是在網(wǎng)絡(luò)中依然存在被竊聽的可能侧纯,典型的例子就是中間人攻擊,客戶端和服務(wù)端在互換公鑰的過(guò)程中甲脏,中間人攔截請(qǐng)求對(duì)客戶端扮演服務(wù)端的角色眶熬,對(duì)服務(wù)器端扮演客戶端角色妹笆,將自己的公鑰發(fā)送給服務(wù)端和客戶端,攔截到數(shù)據(jù)后娜氏,再用自己的私鑰解密拳缠,并且它知道了服務(wù)端的公鑰,就可以用來(lái)偽造請(qǐng)求贸弥,知道了客戶端的公鑰就能偽造響應(yīng)窟坐。

為了解決這個(gè)問(wèn)題,TSL/SSL引入了數(shù)字證書來(lái)進(jìn)行認(rèn)證绵疲,數(shù)字證書中包含了服務(wù)器的名稱和主機(jī)名哲鸳、服務(wù)器的公鑰、簽名頒發(fā)機(jī)構(gòu)的簽名盔憨。在建立連接前徙菠,會(huì)通過(guò)證書中的簽名確認(rèn)收到的公鑰是否來(lái)自目標(biāo)服務(wù)器,從而決定信任與否郁岩。

數(shù)字證書

CA(Certificate Authority,數(shù)字證書認(rèn)證中心)的作用是為站點(diǎn)頒發(fā)證書婿奔,且這個(gè)證書中具有CA通過(guò)自己的公鑰和私鑰實(shí)現(xiàn)的簽名。

服務(wù)器端需要通過(guò)自己的私鑰生成CSR(Certificate Signing Request,證書簽名請(qǐng)求)文件问慎,CA機(jī)構(gòu)將通過(guò)這個(gè)文件頒發(fā)屬于該服務(wù)器的簽名證書萍摊,只要通過(guò)CA機(jī)構(gòu)就能驗(yàn)證證書是否合法。

通過(guò)CA頒發(fā)證書通常是一個(gè)繁瑣的過(guò)程如叼,需要付出一定的精力和費(fèi)用冰木,對(duì)于中小企業(yè)而言,多半采用自簽名證書來(lái)構(gòu)建安全網(wǎng)絡(luò)薇正,所謂自簽名證書就是自己扮演CA機(jī)構(gòu)片酝,給自己的服務(wù)器頒發(fā)簽名證書。

以下為扮演CA角色挖腰,生成私鑰雕沿、生成SCR文件、通過(guò)私鑰自簽名生成證書的過(guò)程:

$ openssl genrsa -out ca.key 1024
$ openssl req -new -key ca.key -out ca.csr
$ openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt

以下為扮演服務(wù)器角色猴仑,向我們自己的CA機(jī)構(gòu)申請(qǐng)簽名:

# 生成服務(wù)器端的CSR文件
$ openssl req -new -key server.key -out server.csr

# 向自己的CA機(jī)構(gòu)申請(qǐng)簽名
$ openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt

CA機(jī)構(gòu)將證書頒發(fā)給服務(wù)端后审轮,證書在請(qǐng)求的過(guò)程中會(huì)被發(fā)送到客戶端,客戶端需要通過(guò)CA的證書驗(yàn)證真?zhèn)瘟伤祝绻侵腃A機(jī)構(gòu)疾渣,它們的證書一般預(yù)裝在瀏覽器中。如果是自己扮演CA機(jī)構(gòu)崖飘,頒發(fā)自簽名證書則不能享受則不能享受這個(gè)福利榴捡,客戶端需要獲取到CA的證書才能進(jìn)行驗(yàn)證。

TLS服務(wù)

創(chuàng)建服務(wù)器端

將構(gòu)建服務(wù)所需要的證書備齊之后朱浴,通過(guò)Node的tls模塊來(lái)創(chuàng)建一個(gè)安全的TCP服務(wù)吊圾。

var tls = require('tls');
var fs = require('fs');

var options = {
  key: fs.readFileSync('./keys/server.key'),
  cert: fs.readFileSync('./keys/server.crt'),
  requestCert: true,
  ca: [ fs.readFileSync('./keys/ca.crt') ]
};
var server = tls.createServer(options, function (stream) {
  console.log('server connected', stream.authorized ? 'authorized' : 'unauthorized');
  stream.write("welcome!\n");
  stream.setEncoding('utf8');
  stream.pipe(stream);
});

server.listen(8000, function() {
  console.log('server bound');
});

啟動(dòng)服務(wù)后达椰,通過(guò)下述命令測(cè)試證書是否正常。

$ openssl s_client -connect 127.0.0.1:8000

TLS客戶端

構(gòu)建客戶端之前项乒,也要生成客戶端屬于自己的私鑰和簽名啰劲。

# 創(chuàng)建私鑰
$ openssl genrsa -out client.key 1024

# 生成CSR
$ openssl req -new -key client.key -out client.csr

# 生成簽名證書
$ openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

創(chuàng)建客戶端

var tls = require('tls');
var fs = require('fs');

var options = {
  key: fs.readFileSync('./keys/client.key'),// 私鑰
  cert: fs.readFileSync('./keys/client.crt'), // 根據(jù)私鑰生成CSR,想CA機(jī)構(gòu)申請(qǐng)的客戶端簽名證書
  ca: [ fs.readFileSync('./keys/ca.crt') ] // CA的簽名證書
};
var stream = tls.connect(8000, options, function () {
  console.log('client connected', stream.authorized ? 'authorized' : 'unauthorized');
  process.stdin.pipe(stream);
});

stream.setEncoding('utf8');

stream.on('data', function(data) {
  console.log(data);
});

stream.on('end', function() {
  server.close();
});

啟動(dòng)客戶端的過(guò)程中檀何,用到了為客戶端生成的私鑰蝇裤、證書、CA證書频鉴,與普通的TCP服務(wù)端和客戶端相比栓辜,TLS就僅僅在這些證書的配置上有差別,其余部分基本相同砚殿。

HTTPS服務(wù)

HTTPS服務(wù)就是工作在TSL/SSL的HTTP啃憎,根據(jù)上面生成的私鑰和證書就能創(chuàng)建HTTPS服務(wù)。

var https = require('https');
var fs = require('fs');

var options = {
  key: fs.readFileSync('./keys/server.key'),// 服務(wù)器私鑰
  cert: fs.readFileSync('./keys/server.crt') // 服務(wù)器簽名證書
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);

https客戶端

var https = require('https');
var fs = require('fs');

var options = {
  hostname: 'localhost',
  port: 8000,
  path: '/',
  method: 'GET',
  key: fs.readFileSync('./keys/client.key'),// 客戶端私鑰
  cert: fs.readFileSync('./keys/client.crt'), // 客戶端簽名證書
  ca: [fs.readFileSync('./keys/ca.crt')] // CA機(jī)構(gòu)證書
};

options.agent = new https.Agent(options);

var req = https.request(options, function(res) {
  res.setEncoding('utf-8');
  res.on('data', function(d) {
    console.log(d);
  });
});
req.end();

req.on('error', function(e) {
  console.log(e);
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末似炎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悯姊,更是在濱河造成了極大的恐慌羡藐,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悯许,死亡現(xiàn)場(chǎng)離奇詭異仆嗦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)先壕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門瘩扼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人垃僚,你說(shuō)我怎么就攤上這事集绰。” “怎么了谆棺?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵栽燕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我改淑,道長(zhǎng)碍岔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任朵夏,我火速辦了婚禮蔼啦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仰猖。我一直安慰自己捏肢,他們只是感情好奈籽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猛计,像睡著了一般唠摹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奉瘤,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天勾拉,我揣著相機(jī)與錄音,去河邊找鬼盗温。 笑死藕赞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卖局。 我是一名探鬼主播斧蜕,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砚偶!你這毒婦竟也來(lái)了批销?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤染坯,失蹤者是張志新(化名)和其女友劉穎均芽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體单鹿,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掀宋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仲锄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲妙。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖儒喊,靈堂內(nèi)的尸體忽然破棺而出镣奋,到底是詐尸還是另有隱情,我是刑警寧澤澄惊,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布唆途,位于F島的核電站,受9級(jí)特大地震影響掸驱,放射性物質(zhì)發(fā)生泄漏肛搬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一毕贼、第九天 我趴在偏房一處隱蔽的房頂上張望温赔。 院中可真熱鬧,春花似錦鬼癣、人聲如沸陶贼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拜秧。三九已至痹屹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枉氮,已是汗流浹背志衍。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聊替,地道東北人楼肪。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像惹悄,于是被迫代替她去往敵國(guó)和親春叫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容