Nodejs+Express創(chuàng)建HTTPS服務(wù)器

終于有時間整理了。。。

為了使我的Nodejs服務(wù)器提供HTTPS服務(wù),學(xué)習(xí)了一下如何利用express創(chuàng)建https服務(wù)器,現(xiàn)記錄如下。(一點一點的積累與掌握吧)


1. Http與Https

介紹

  • HTTP: 超文本傳輸協(xié)議 (Hypertext transfer protocol) 是一種詳細(xì)規(guī)定了瀏覽器和萬維網(wǎng)服務(wù)器之間互相通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
  • HTTPS:(Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。 它是一個URI scheme(抽象標(biāo)識符體系),句法類同http:體系。用于安全的HTTP數(shù)據(jù)傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默認(rèn)端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統(tǒng)的最初研發(fā)由網(wǎng)景公司進行,提供了身份驗證與加密通訊方法,現(xiàn)在它被廣泛用于萬維網(wǎng)上安全敏感的通訊,例如交易支付方面。

區(qū)別

  • https協(xié)議需要到ca申請證書,一般免費證書很少,需要交費。
  • http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議。
  • http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
  • http的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。

2. 使用Express創(chuàng)建Https服務(wù)器

在Nodejs中,我們可以通過內(nèi)置的https庫,來實現(xiàn)HTTPS服務(wù)器。

  • 首先,我們需要利用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!');
    }
});
  • 啟動服務(wù)器:
$ node server.js
HTTP Server is running on: http://localhost:18080
HTTPS Server is running on: https://localhost:18081
  • 打開瀏覽器

HTTP訪問:


HTTP訪問

HTTPS訪問:


HTTPS訪問

查看證書:


查看證書

由于我們證書是自己創(chuàng)建的,沒有經(jīng)過第三方機構(gòu)的驗證,所以會出現(xiàn)警告的提示。有條件的可以去godaddy SSL Cert官網(wǎng)申請,當(dāng)然挺貴的,免費黨就選擇了WoSign,也是可以的,詳情見[https://weixin.frankfan.me]

WoSign驗證證書

至此,我們成功的利用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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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