客戶端發起請求,服務器收到請求後將證書發送給客戶端,證書中包含了服務器端的公鑰,客戶端收到證書後,生成一個對稱密鑰,並取出服務器公鑰對這個對稱密鑰進行加密,服務端收到後用私鑰進行解密,拿到客戶端發送過來的對稱密鑰,以後客戶端和服務端將採用這個對稱密鑰進行加密和解密數據。javascript
因此建立https服務器的時候,必需要提供服務器的私鑰和證書。html
證書的生成須要經過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: 表示自動生成證書的序列號
因此證書其實也就是一個包含密鑰的文件。
如今有了服務器證書和服務器私鑰就能夠建立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服務器了: