終于有時(shí)間整理了腌歉。依痊。避除。
為了使我的Nodejs服務(wù)器提供HTTPS服務(wù),學(xué)習(xí)了一下如何利用express創(chuàng)建https服務(wù)器胸嘁,現(xiàn)記錄如下瓶摆。(一點(diǎn)一點(diǎn)的積累與掌握吧)
1. Http與Https
介紹
- HTTP: 超文本傳輸協(xié)議 (Hypertext transfer protocol) 是一種詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)服務(wù)器之間互相通信的規(guī)則,通過(guò)因特網(wǎng)傳送萬(wàn)維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議性宏。
- HTTPS:(Hypertext Transfer Protocol over Secure Socket Layer)赏壹,是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版衔沼。即HTTP下加入SSL層蝌借,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL指蚁。 它是一個(gè)URI scheme(抽象標(biāo)識(shí)符體系)菩佑,句法類(lèi)同http:體系。用于安全的HTTP數(shù)據(jù)傳輸凝化。https:URL表明它使用了HTTP稍坯,但HTTPS存在不同于HTTP的默認(rèn)端口及一個(gè)加密/身份驗(yàn)證層(在HTTP與TCP之間)。這個(gè)系統(tǒng)的最初研發(fā)由網(wǎng)景公司進(jìn)行搓劫,提供了身份驗(yàn)證與加密通訊方法瞧哟,現(xiàn)在它被廣泛用于萬(wàn)維網(wǎng)上安全敏感的通訊,例如交易支付方面枪向。
區(qū)別
- https協(xié)議需要到ca申請(qǐng)證書(shū)勤揩,一般免費(fèi)證書(shū)很少,需要交費(fèi)秘蛔。
- http是超文本傳輸協(xié)議陨亡,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議深员。
- http和https使用的是完全不同的連接方式负蠕,用的端口也不一樣,前者是80倦畅,后者是443遮糖。
- http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的叠赐;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸欲账、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全燎悍。
2. 使用Express創(chuàng)建Https服務(wù)器
在Nodejs中敬惦,我們可以通過(guò)內(nèi)置的https庫(kù),來(lái)實(shí)現(xiàn)HTTPS服務(wù)器谈山。
- 首先俄删,我們需要利用openssl生成證書(shū)文件:
#生成私鑰key文件
openssl genrsa 1024 > /path/to/private.pem
//
#通過(guò)私鑰文件生成CSR證書(shū)簽名
openssl req -new -key /path/to/private.pem -out csr.pem
//
#通過(guò)私鑰文件和CSR證書(shū)簽名生成證書(shū)文件
openssl x509 -req -days 365 -in csr.pem -signkey /path/to/private.pem -out /path/to/file.crt
新生成了三個(gè)文件:
- private.pem: 私鑰
- csr.pem: CSR證書(shū)簽名
- file.crt: 證書(shū)文件
- 修改Nodejs啟動(dòng)文件server.js:
var app = require('express')();
var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey = fs.readFileSync('/path/to/private.pem', 'utf8');
var certificate = fs.readFileSync('/path/to/file.crt', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
var PORT = 18080;
var SSLPORT = 18081;
httpServer.listen(PORT, function() {
console.log('HTTP Server is running on: http://localhost:%s', PORT);
});
httpsServer.listen(SSLPORT, function() {
console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
});
// Welcome
app.get('/', function(req, res) {
if(req.protocol === 'https') {
res.status(200).send('Welcome to Safety Land!');
}
else {
res.status(200).send('Welcome!');
}
});
- 啟動(dòng)服務(wù)器:
$ node server.js
HTTP Server is running on: http://localhost:18080
HTTPS Server is running on: https://localhost:18081
- 打開(kāi)瀏覽器
HTTP訪問(wèn):
HTTP訪問(wèn)
HTTPS訪問(wèn):
HTTPS訪問(wèn)
查看證書(shū):
查看證書(shū)
由于我們證書(shū)是自己創(chuàng)建的,沒(méi)有經(jīng)過(guò)第三方機(jī)構(gòu)的驗(yàn)證奏路,所以會(huì)出現(xiàn)警告的提示畴椰。有條件的可以去godaddy SSL Cert官網(wǎng)申請(qǐng),當(dāng)然挺貴的鸽粉,免費(fèi)黨就選擇了WoSign斜脂,也是可以的,詳情見(jiàn)[https://weixin.frankfan.me]触机。
WoSign驗(yàn)證證書(shū)
至此帚戳,我們成功的利用Nodejs內(nèi)置https和express創(chuàng)建了HTTPS服務(wù)器玷或。
參考:
http://blog.fens.me/nodejs-https-server/
http://heyrod.com/snippet/s/node-https-ssl.html