終于有時間整理了。。。
為了使我的Nodejs服務器提供HTTPS服務,學習了一下如何利用express創建https服務器,現記錄如下。(一點一點的積累與掌握吧)
1. Http與Https
介紹
- HTTP: 超文本傳輸協議 (Hypertext transfer protocol) 是一種詳細規定了瀏覽器和萬維網服務器之間互相通信的規則,通過因特網傳送萬維網文檔的數據傳送協議。
- HTTPS:(Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用于安全的HTTP數據傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司進行,提供了身份驗證與加密通訊方法,現在它被廣泛用于萬維網上安全敏感的通訊,例如交易支付方面。
區別
- https協議需要到ca申請證書,一般免費證書很少,需要交費。
- http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
- http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
- http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
2. 使用Express創建Https服務器
在Nodejs中,我們可以通過內置的https庫,來實現HTTPS服務器。
- 首先,我們需要利用openssl生成證書文件:
#生成私鑰key文件
openssl genrsa 1024 > /path/to/private.pem
//
#通過私鑰文件生成CSR證書簽名
openssl req -new -key /path/to/private.pem -out csr.pem
//
#通過私鑰文件和CSR證書簽名生成證書文件
openssl x509 -req -days 365 -in csr.pem -signkey /path/to/private.pem -out /path/to/file.crt
新生成了三個文件:
- private.pem: 私鑰
- csr.pem: CSR證書簽名
- file.crt: 證書文件
- 修改Nodejs啟動文件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!');
}
});
- 啟動服務器:
$ node server.js
HTTP Server is running on: http://localhost:18080
HTTPS Server is running on: https://localhost:18081
- 打開瀏覽器
HTTP訪問:
HTTP訪問
HTTPS訪問:
HTTPS訪問
查看證書:
查看證書
由于我們證書是自己創建的,沒有經過第三方機構的驗證,所以會出現警告的提示。有條件的可以去godaddy SSL Cert官網申請,當然挺貴的,免費黨就選擇了WoSign,也是可以的,詳情見[https://weixin.frankfan.me]。
WoSign驗證證書
至此,我們成功的利用Nodejs內置https和express創建了HTTPS服務器。
參考:
http://blog.fens.me/nodejs-https-server/
http://heyrod.com/snippet/s/node-https-ssl.html