前言
SSL數(shù)字簽名實(shí)現(xiàn)網(wǎng)站的HTTPS化,可以使網(wǎng)站可信,防劫持、防篡改、防竊聽,是未來網(wǎng)站安全的發(fā)展趨勢(shì)。
今天,我將以個(gè)人的名義申請(qǐng)SSL數(shù)字證書,并部署在node.js服務(wù)器上。
1.在阿里云申請(qǐng)免費(fèi)的個(gè)人SSL數(shù)字證書
阿里云的數(shù)字證書服務(wù)地址: https://www.aliyun.com/product/cas?spm=5176.8142029.388261.120.BiDYTi

注意到這里有多種類型的證書,個(gè)人網(wǎng)站的證書只要用DV即可(阿里云是免費(fèi)的)。
- 域名驗(yàn)證型SSL(Domain Validation SSL),不顯示任何信息,是最基礎(chǔ)級(jí)的SSL證書???0分鐘快速頒發(fā),能起到加密傳輸?shù)淖饔?,但無法向用戶證明網(wǎng)站的真實(shí)身份。目前市面上的免費(fèi)證書都是這個(gè)類型的,只是提供了對(duì)數(shù)據(jù)的加密,但是對(duì)提供證書的個(gè)人和機(jī)構(gòu)的身份不做驗(yàn)證。
- 機(jī)構(gòu)驗(yàn)證型SSL(Organization Validation SSL),提供加密功能,對(duì)申請(qǐng)者做嚴(yán)格的身份審核驗(yàn)證,提供可信身份證明。適合電子商務(wù)、電子政務(wù)網(wǎng)站、企事業(yè)單位管理系統(tǒng)、電子郵件系統(tǒng)使用,證書里顯示單位名稱。
- 擴(kuò)展驗(yàn)證型SSL(Extended Validation SSL),超安=EV=最安全、最嚴(yán)格 超安EV SSL證書遵循全球統(tǒng)一的嚴(yán)格身份驗(yàn)證標(biāo)準(zhǔn),是目前業(yè)界安全級(jí)別最高的頂級(jí) (Class 4級(jí))SSL證書。適合銀行金融類電子商務(wù)網(wǎng)站(網(wǎng)上購(gòu)物)使用,證書里顯示單位名稱,顯示綠色地址欄。
2.驗(yàn)證身份并增加域名解析
進(jìn)入后臺(tái)(證書服務(wù)),根據(jù)提交你的資料。

如果你的域名是在阿里云的外網(wǎng)管理的,可勾選并自動(dòng)寫入一個(gè)記錄;如果不是,那么不是,則在提交驗(yàn)證資料后,按照提示進(jìn)入域名控制臺(tái)增加一個(gè)記錄。

3.下載證書
在身份驗(yàn)證通過并設(shè)置好解析后,在證書控制臺(tái)就可以看到這樣的內(nèi)容:

點(diǎn)擊“下載”:

發(fā)現(xiàn)并沒有node.js的類型。這個(gè)無所謂,選擇“其他”,直接下載證書即可。這樣下載的證書是最完整的。

我們?cè)趎ode.js服務(wù)中,需要用到2個(gè)文件:
// 私鑰
xxxxx.key
// 證書
xxxxx.pem
4.啟用https服務(wù)
首先, https服務(wù)需要監(jiān)聽 443 端口,所以在開啟服務(wù)之前,先檢查 443 端口是否被占用。如果已被占用,需要關(guān)閉占用的服務(wù)。
我們先搭建一個(gè)Express框架的node.js服務(wù)器(如果不知道如何搭建,請(qǐng)閱讀 Node.js框架之Express)。
首先,我們?cè)诟夸浵聞?chuàng)建一個(gè)文件夾 cert ,用于存放私鑰和證書。把下載到的兩個(gè)文件(私鑰xxxxx.key 和 證書xxxxx.pem)放入此文件夾,分別將私鑰xxxxx.key 重命名為 private.key 和 證書xxxxx.pem重命名為 file.crt。
在 bin/www 文件中,在監(jiān)聽默認(rèn)端口后面增加下面代碼:
// ...
// server.listen(port);
// server.on('error', onError);
// server.on('listening', onListening);
// https
var https = require('https');
var fs = require('fs');
var privateKey = fs.readFileSync('./cert/private.key', 'utf8'),
certificate = fs.readFileSync('./cert/file.crt', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var httpsServer = https.createServer(credentials, app);
var SSLPort = 443;
httpsServer.listen(SSLPort, function() {
console.log('OneLib https is running', SSLPort);
});
// ...
然后在瀏覽器中輸入 https:// 和 你的網(wǎng)站域名進(jìn)行訪問;也可在本地進(jìn)行調(diào)試:
https://127.0.0.1
不過在本地調(diào)試,一定會(huì)提示你證書風(fēng)險(xiǎn)或證書錯(cuò)誤的,因?yàn)槟闵暾?qǐng)到的證書在用于申請(qǐng)的域名的。

參考資料: