【原創】NodeJs 搭建https服務

1、http、https、http2的關系

http:目前絕大多數是http1.1版本,最原始的web協議,默認80端口,基于TCP協議。
https:加密的http協議(http+SSL/TLS),默認443端口,基于TCP協議。
http2:第二代http協議,相較于HTTP1.x,大幅度的提升了web性能。在與HTTP/1.1完全語義兼容的基礎上,進一步減少了網絡延遲和傳輸的安全性,基于TCP協議。

2、HTTPS服務

2.1 自建CA

// 1.生成CA私匙,des3代表加密算法,還可以選擇aes256等
openssl genrsa -des3 -out ica.key 1024
// 2.生成CA證書請求
openssl req -new -key ica.key -out ssl.csr
// 3.生成CA根證書
openssl x509 -req -in ica.csr -extensions v3_ca -signkey ica.key -out ica.crt

2.2 server端證書

如果用戶想得到一份屬于自己的證書,他應先向 CA 提出申請。在 CA 判明申請者的網站信息后,便為他分配一個公鑰,并且 CA 將該公鑰與申請者的身份信息綁在一起,并為之簽字后,便形成證書發給申請者。自建CA生成的如下server.crt并不能讓服務器信任,實際開發中是第三方CA證書管理機構(付費的,可以理解為他們自建的CA被瀏覽器開發者添加到了可信任的證書頒發機構列表中)簽發證書給申請者,瀏覽器才信任。但是咱們可以把自建的CA證書添加到瀏覽器可信任列表中,具體見本文2.5。

// 1.生成server私匙
openssl genrsa -out server.key 1028
// 2.生成server證書請求
openssl req -new -key server.key -out server.csr
// 3.生成server證書
openssl x509 -days 365 -req -in server.csr -extensions  v3_req -CAkey ica.key -CA ica.crt -CAcreateserial -out server.crt  -extfile openssl.cnf

說明:
openssl.cnf文件內容

[req]  
    distinguished_name = req_distinguished_name  
    req_extensions = v3_req  

    [req_distinguished_name]  
    countryName = CN 
    countryName_default = CN  
    stateOrProvinceName = Beijing  
    stateOrProvinceName_default = Beijing  
    localityName = Beijing 
    localityName_default = Beijing
    organizationalUnitName  = HD
    organizationalUnitName_default  = HD
    commonName = localhost  
    commonName_max  = 64  

    [ v3_req ]  
    # Extensions to add to a certificate request  
    basicConstraints = CA:FALSE  
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment  
    subjectAltName = @alt_names  

    [alt_names]  
   #注意這個IP.1的設置,IP地址需要和你的服務器的監聽地址一樣 DNS為server網址,可設置多個ip和dns
    IP.1 = 127.0.0.1
    DNS.1 = localhost

2.3 node.js搭建https服務器

//使用nodejs自帶的http、https模塊
const https = require('https');
const http = require('http');
const fs = require('fs');
const path = require('path');
const koa = require('koa');
const app = new koa();

app.on('error', (error, ctx) => {
    console.log('something error ' + JSON.stringify(ctx.onerror));
});

app.use(async ctx => {
    ctx.body = `This is ${ctx.protocol} visit`;
});

//根據項目的路徑導入生成的證書文件
const privateKey  = fs.readFileSync(path.join(__dirname, './certificate/server.key'), 'utf8');
const certificate = fs.readFileSync(path.join(__dirname, './certificate/server.crt'), 'utf8');
const credentials = {key: privateKey, cert: certificate};

//創建http與HTTPS服務器
const httpServer = http.createServer(app.callback());
const httpsServer = https.createServer(credentials, app.callback());

//可以分別設置http、https的訪問端口號
const PORT = 8000;
const SSLPORT = 8001;

//創建http服務器
httpServer.listen(PORT, function() {
    console.log('HTTP Server is running on: http://localhost:%s', PORT);
});

//創建https服務器
httpsServer.listen(SSLPORT, function() {
    console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
});

2.4 nginx配置https

server {
        listen       80;
        server_name  localhost;
        rewrite ^ https://$http_host$request_uri? permanent;   
        # force redirect http to https
    }
server {
       listen       443 ssl;
        server_name  localhost;
        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

       location / {
            root   D:\myProjects\hmall-pc\src\main\webapp;
            try_files $uri $uri/ @router;
            index hmall-base.html;
        }
    }

2.5 消除瀏覽器安全警告

因為我們不是官方的CA機構并沒有內置在瀏覽器或系統中,所以瀏覽器會認為該CA非法,此時我們需要將我們自建CA的根證書(ica.crt)加入到瀏覽器中。
Chrome :設置-設置-設置-高級-隱私設置和安全性-管理證書-導入
火狐:設置-選項-隱私與安全-證書-查看證書-證書機構-導入
親測火狐導入之后有效,chrome的依然有安全警告...


火狐添加ica.crt之后

3、加密方式

3.1 對稱加密

  • 對稱加密:加密和解密用同一個秘鑰的加密,特點是快。


    對稱加密
  • 對稱加密的算法存在的問題:
    多個客戶端的時候,在一端生成一個秘鑰,傳輸秘鑰的過程,如果被中間人攔截,秘鑰也會被獲取。


    多用戶對稱加密

3.2 非對稱加密

  • 非對稱加密:會有一對秘鑰公鑰和私鑰,公鑰加密,私鑰解密,特點是安全,但是慢。


    非對稱加密
  • 非對稱加密存在的問題:
    私鑰只保存在服務器端,公鑰可以發送給所有的客戶端。在傳輸公鑰的過程中,有被中間人獲取的風險,雖然中間人是無法破解(因為私鑰只保存在服務器端,只有私鑰可以破解公鑰加密的內容),但是公鑰被中間人拿到可篡改。


    Man-in-the-MiddleAttack篡改公鑰

    如果中間人篡改公鑰,客戶端和服務器端相互傳遞的消息容易都是假的。

3.3 第三方認證

  • 公鑰被掉包,是因為客戶端無法分辨傳回公鑰的到底是中間人,還是服務器。在HTTPS中,使用 數字證書(網站信息 + 數字簽名)來解決這個問題,中間人攔截后把服務器的公鑰替換為自己的公鑰,因為數字簽名的存在,會導致客戶端驗證簽名不匹配,這樣就防止了中間人替換公鑰的問題。
    數字簽名:將網站的信息加密后通過第三方機構的私鑰再次進行加密,生成數字簽名。
    第三方證書

4、https工作機制

https工作機制
  • client使用公鑰A給秘鑰X加密,server使用私鑰B給秘鑰X解密,這一過程是非對稱加密。
  • client和server利用對稱加密秘鑰X的快捷性來加密解密報文

參考文章:
https://blog.csdn.net/m0_37263637/article/details/80314093
https://www.kuacg.com/22672.html
http://www.lxweimin.com/p/b92d4c8cbe05

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容

  • 本文摘自 騰訊bugly 的文章《全站 HTTPS 來了》,內容有修改。 大家在使用百度、谷歌或淘寶的時候,是否注...
    bnotes閱讀 3,673評論 1 9
  • 前言 文中首先解釋加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的...
    sunny沖哥閱讀 3,006評論 0 2
  • 數字證書原理 - 無恙 - 博客園 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明...
    拉肚閱讀 1,675評論 0 3
  • 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的出現...
    sunny沖哥閱讀 1,398評論 0 3
  • 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的出現...
    已認證用戶閱讀 3,860評論 1 4