如今已經(jīng) 0202 年了,互聯(lián)網(wǎng)安全性已收到越來越高的重視,作為前端開發(fā)人員,時常需要配置支持 https 協(xié)議的 node 后臺來做一系列的操作,這里做個記錄,希望對看的人有所幫助。
配置 HTTPS 服務需要哪些文件?
通常來說,我們需要在服務端有兩份文件,一份是私鑰文件,一份是證書文件。
在一次簡化的 https 訪問中,客戶端和服務端經(jīng)歷了以下幾個步驟:
- 客戶端發(fā)送請求(客戶端支持的加密協(xié)議及版本等信息)
- 服務端選擇加密協(xié)議并向客戶端發(fā)送證書,證書里有公鑰信息。
- 客戶端拿到證書后向 CA(證書簽發(fā)機構)服務器進行證書驗證,通過后選擇隨機字符串 R 并用公鑰進行加密發(fā)送給服務端。
- 服務端接收到加密信息后用約定好的加密協(xié)議和存在服務端的私鑰進行解密獲得 R。
- 以上就是一個簡化的 https 三次握手,知道服務端獲得對稱加密秘鑰(R)后才開始
建立通信,使用指定的對稱加密算法雙端進行信息通信。
想比于 http 都是明文在互聯(lián)網(wǎng)傳輸,在現(xiàn)在看來仿佛裸奔,https 密文傳輸極大地提高了安全性,在互聯(lián)網(wǎng)場景下包含了大量的用戶私密信息(支付,個人信息等),如果沒有這些加密手段,便捷的互聯(lián)網(wǎng)服務也就沒有可能。
基于大素數(shù)因數(shù)分解的 RSA 非對稱加密算法目前被破解的最大位數(shù)是 768位二進制,而我們平常使用的密鑰至少是 1024 位的,在重要場合使用 2048 甚至更長的位數(shù),因而 RSA 加密可以放心地使用,至于神奇的非對稱加密算法原理,有興趣的可以翻看這篇博文作進一步了解:使用Python實現(xiàn)RSA加密算法及詳解RSA算法
如何獲取密鑰和證書?
在介紹使用方法之前,需要了解 der pem csr cer crt 這些概念的區(qū)別,具體的細節(jié)可以自行搜索。獲取證書的順序是我們先將域名,郵箱等一系列信息使用特定的加密算法(如 RSA)生成一份 csr 文件和一份 密鑰文件(需要自己保管好),csr 稱為證書簽名請求,這個并不是證書,而是向權威證書頒發(fā)機構獲得簽名證書的申請,其核心內容是一個公鑰(當然還附帶了一些別的信息)。使用這個 csr 文件申請的才是所需要的證書,通常 windows 使用擴展名為 crt 的證書,unix/linux 使用擴展名為 cer 的證書。
方法一:安裝 openssl 使用命令行生成。
// 生成私鑰
openssl genrsa -out privatekey.pem 1024
// 根據(jù)私鑰生成證書申請簽名
openssl req -new -key privatekey.pem -out certrequest.csr
// 生成證書
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
值得一提的是使用命令前先切換到項目所在目錄,并把私鑰和證書命名為你需要的測試域名前綴方便管理,如方法二里所示。
方法二:在線生成。
首先,打開 CSR文件在線生成工具,填寫域名等信息后生成 csr 和 key 文件(需要妥善保存)。然后到 [輸入CSR請求文件](https://csr.chinassl.net/free-ssl.html,把 csr 文件內容復制到對話框里生成證書,保存證書和 key 文件就可以了。
使用 express 搭建一個 https 服務?
我將 key 和 crt 放到 express 項目同級目錄下,app.js 代碼如下:
const express = require('express')
// 創(chuàng)建 express 應用
const app = express()
// 監(jiān)聽 / 路徑的 get 請求
app.get('/', function(req, res) {
res.send('hello node')
})
const fs = require('fs') // https服務器
const https = require('https') // 文件輸入輸出,用來導入證書
const privateKey = fs.readFileSync('book.epub_key.txt', 'utf8')
const certificate = fs.readFileSync('book.epub_ssl.crt', 'utf8')
const credentials = { key: privateKey, cert: certificate }
const httpsServer = https.createServer(credentials, app)
const SSLPORT = 18082
httpsServer.listen(SSLPORT, function() {
console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT)
})
開啟服務后,打開瀏覽器輸入:https://localhost:18082 ,看到 'hello, node', 配置成功。當然你也可以用 SwitchHosts 把 localhost 映射為你自己的域名。