express開啓https服務器

1、https服務器請求處理過程

客戶端發起請求,服務器收到請求後將證書發送給客戶端,證書中包含了服務器端的公鑰,客戶端收到證書後,生成一個對稱密鑰並取出服務器公鑰對這個對稱密鑰進行加密,服務端收到後用私鑰進行解密,拿到客戶端發送過來的對稱密鑰,以後客戶端和服務端將採用這個對稱密鑰進行加密和解密數據。javascript

因此建立https服務器的時候,必需要提供服務器的私鑰和證書html

2、生成服務器的私鑰和證書

證書的生成須要經過CA(Certificate Authority,數字證書認證中心)簽名,因此咱們必須先要有一個CA機構,CA機構頒發證書的時候,主要須要用到CA的私鑰和CA的根證書。咱們能夠經過linux自帶的openssl命令進行生成,如:java

① 生成CA的私鑰linux

# 生成CA機構的私鑰
openssl genrsa -out ca.private.key 1024;

備註:
genrsa: 表示生成RSA私有密鑰,不須要生成公鑰,由於公鑰提取自私鑰,知道了私鑰就可以經過命令提取出公鑰
-out: 表示生成的私鑰輸出文件名
1024: 表示私鑰的長度爲1024位,不能過小

須要注意的是,客戶端在傳輸對稱密鑰的時候,須要用到服務器公鑰,可是這個公鑰不須要咱們本身生成,由於公鑰是提取自私鑰的,拿到了私鑰就能夠經過命令獲取到對應的公鑰,因此咱們後面向CA機構申請證書的時候並不須要提供服務器的公鑰,只須要提供私鑰便可,如:express

# 演示公鑰的提取方式(僅僅演示公鑰的提取過程,申請證書並不須要用到)
openssl rsa -in ca.private.key -pubout -out ca.public.pem

備註:
rsa: 表示提取公鑰
-in: 表示輸入,即傳入私鑰
-pubout: 表示輸出公鑰

② 用CA的私鑰生成CA證書籤名請求CSR文件
CSR即證書籤名申請(Certificate Signning Request),是生成證書時必需要用到的文件,咱們要製做CA機構的根證書,必須先生成對應的CSR文件,而CSR文件必須經過私鑰生成,如:瀏覽器

# 用CA的私鑰生成CA證書籤名請求csr文件
openssl req -new -key ca.private.key -out ca.csr

備註:
req: 表示生成證書籤名請求
-new: 表示生成一個新的
-key: 表示生成證書籤名請求時用到的私鑰

生成CSR文件的時候,須要填寫一些信息,好比國家城市組織或企業部門域名服務器

③ 用CA的私鑰和CA的證書籤名請求文件,生成CA的根證書
前面說過生成證書須要用到證書全部者的私鑰證書籤名請求文件,如:app

# 用CA的私鑰和CA的證書籤名請求文件,生成CA的根證書
openssl x509 -req -in ca.csr -signkey ca.private.key -days 3650 -out ca.root.crt

備註:
x509: 表示生成一個X509格式的證書
-req: 表示輸入文件是一個"請求籤發證書文件(CSR)",等待進行簽發
-signkey: 表示用於簽名的私鑰
-days: 表示證書的有效期爲10年

至此 CA的私鑰和根證書已經生成完畢了,也就是說,已經擁有CA這個機構了。接下來就是給服務器頒發證書了,如:ui

④ 生成服務器的私鑰加密

# 生成服務器的私鑰
openssl genrsa -out server.private.key 1024

⑤ 用服務器的私鑰生成服務器的證書籤名請求csr文件

# 用服務器的私鑰生成服務器的證書籤名請求csr文件
openssl req -new -key server.private.key -out server.csr

⑥ 經過CA機構向服務器頒發證書
CA機構頒發證書須要用到CA本身的私鑰CA本身的根證書以及服務器的證書籤名請求文件,這些都已經生成好了,以下:

# 用CA的私鑰、CA的根證書以及服務器的證書籤名請求文件生成服務器的證書
openssl x509 -req -CA ca.root.crt -CAkey ca.private.key -CAcreateserial -in server.csr -out server.crt

備註:
x509: 表示生成一個X509格式的證書
-req: 表示輸入文件是一個"請求籤發證書文件(CSR)",等待進行簽發
-CA: 表示指定CA的根證書
-CAkey: 表示指定CA的私鑰
-CAcreateserial: 表示自動生成證書的序列號

因此證書其實也就是一個包含密鑰的文件

3、啓動https服務器

如今有了服務器證書和服務器私鑰就能夠建立https服務器了,建立https服務器很簡單,主要就是要讀取到服務器的私鑰和服務器的證書,而後在建立server的時候傳入便可,如:

var express = require('express');
// 引入https模塊
var https = require('https');
var fs = require('fs');
//同步讀取密鑰和簽名證書
const options = {
    key:fs.readFileSync('./server.private.key'),
    cert:fs.readFileSync('./server.crt')
}
var app = express();
// 建立https server的時候 傳入服務器私鑰和服務器證書
var httpsServer = https.createServer(options,app);
app.use(express.static("./dist"));
//https監聽8080端口
httpsServer.listen(8080);

啓動服務器後,打開瀏覽器訪問https://localhost:8080/index.html,會提示安裝證書,安裝的證書以下,表示證書安裝成功,能夠正常訪問https服務器了:
屏幕快照 2020-04-10 下午6.33.50.png

相關文章
相關標籤/搜索