使用mkcert 爲(nodejs)本地後端服務器的https安裝ssl證書

閒聊:

如果這是你安裝https的ssl證書,觀看的第一篇博客,恭喜你到家了,其它的博客不用看了。

如果這是你安裝https的ssl證書,觀看的第N篇博客,恭喜你終於發現我了,這篇博客一定能幫你解決問題。

注意:本篇主要是爲解決本地後端服務器的https而寫的博客。

知識彙總:

博主從昨天下午4點開始跋山涉水,觀看了將近30篇博客,什麼csdn 知乎 思否 掘金 ...各大平臺都進了,嘗試了各種方法,歷經8個小時終於解決了問題。

先說一下當前本地爲https安裝證書的幾種方式:

   1.使用openssl爲https安裝證書。(博主的項目前端是微信小程序,後端是用nodejs寫的。初次調接口時就是用這個spenssl搞的,也是花費了不少時間,裝上了證書,確實好用,但是過了幾個月有一天就突然不好用了,瀏覽器訪問,提示當前證書無效)。

  2.使用mkcert安裝ssl證書。(mkcert具體是什麼這裏就不多介紹了,可以在npm下搜到。使用mkcert安裝ssl有兩種方式)

    2.1.通過npm包管理器把這個mkcert下載下來,但是這個下載下來的是個包,通過它的readme.md一頓操作,最後會生成一個key 和cert文本。

    2.2.通過直接下載mkcert.exe來安裝ssl證書。

2.1安裝步驟:

1.打開控制檯(win+R 輸入cmd)輸入npm install -g mkcert 會有一個安裝路徑,找到路徑下的mkcert文件夾。拷出來新建一個文件夾並在文件夾下新建一個index.js文件。如圖:

打開readme.md 人家有給好的方式。第一步先調mkcert.createCA()方法,會生成key,cert兩個文本。===>生成機構

index.js

const mkcert = require('./mkcert');

mkcert.createCA({

organization: 'Hello CA',

countryCode: 'NP',

state: 'Bagmati',

locality: 'Kathmandu',

validityDays: 365

})

.then((ca)=> {

console.log(ca.key, ca.cert);

// ca_key = ca.key;

// ca_cert = ca.cert;

})

.catch(err=> console.error(err));

2.生成證書:調用mkcert.createCert()方法,這裏有個問題如果通過傳參把第一步生成的key與cert傳進去總是報Invalid PEM formatted message.所以呢 就把第一步返回的值(一定要包括BEGIN RSA開頭與結尾)拷到src下的mkcert.js createCert方法裏,修改相應的調用參數名,就可以使用下面方法調一下,就能返回證書的key cert了。

在這兩個方法前,定義倆變量,把第一步的值賦給倆變量(一定要包括BEGIN RSA開頭與結尾哦!)

index.js

mkcert.createCert({

domains: ['127.0.0.1', 'localhost'],

validityDays: 365,

// caKey: ca_key,

// caCert: ca_cert

})

.then((cert)=> {

console.log(cert.key, cert.cert);

})

.catch(err=> console.error(err));

3.把返回的key cert放在兩個文件內 同步到2.2安裝步驟的第二步末尾,此時的兩文件就是證書的cert 與key了。

 

 

2.2安裝步驟:

1.下載mkcert.exe文件。地址:https://github.com/FiloSottile/mkcert/releases

2.生成證書:

打開控制檯(win+R 輸入cmd)

把下載的.exe文件拖到控制檯裏 並在後面輸入 -install

我這裏有個錯誤,不過問題不大。

接着再進行相同的操作輸入localhost 127.0.0.1

這裏會生成兩個文件 localhost+1.pem localhost+1-key.pem這兩個文件的地址就在

此目錄下。這裏的兩個文件一個是key另一個是cert。

如果你的後端是nodejs (node不會使用root store,因此需要特殊對待,命令行手動設置NODE_EXTRA_CA_CERTS這個環境變量)

最後一步再執行:set NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"

3.使用證書:(以nodejs後端爲例,下面拷貝server.js的完整代碼需要什麼拷什麼吧!)

/**

* need:引入中間件

* des:引入需要的中間件

* author:starLight

* time:2019/12/22

*/


 

const express = require('express');//引入express框架。

const https = require('https');//引入https中間件。

const fs = require('fs');//引入fs中間件。

const expressStatic = require('express-static');//引入express框架的靜態文件處理中間件。

const bodyParser = require('body-parser');//引入解析post請求數據的中間件。

 

//創建服務對象

let server = express();

//bodyParser配置

server.use(bodyParser.json());

// 使用body-parser解析post請求的url.

server.use(bodyParser.urlencoded({

extended:true,

limit: 2*1024*1024

}));

 

/**

* need:跨域處理。

* des:通過對請求頭設置,來允許需要的域名進行訪問。

* author:starLight

* time:2019/12/24

*/

 

server.all('*',(req,res,next) => {

res.header('Access-Control-Allow-Origin', '*');

res.header('Access-Control-Allow-Methods', 'GET , POST');

res.header('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization');

// res.header("Content-Type", "application/json;charset=utf-8");

next();

})

 

/**

* need:分配路由

* des:對wx/pc兩大系統進行路由分配。

* author:starLight

* time:2019/12/23

*/

let wx = require('./route/wx/wx.js');//一級路由,註冊路由

//微信路由請求

server.use('/alumnicircle/wx',wx);

 

let pc = require('./route/pc/pc.js');//一級路由,註冊路由

//pc路由請求

server.use('/alumnicircle/pc',pc);

 

/**

* need:端口監聽

* des:監聽服務器端口。

* author:starLight

* time:2019/12/23

*/

//爲https請求添加ssl證書

const httpsOption = {

key : fs.readFileSync("./https/key.pem"),

cert : fs.readFileSync("./https/cert.pem")

}

//https請求

https.createServer(httpsOption, server).listen(443,() => {

const hostname = 'localhost';

const port = 443;

console.log(`Server running at https://${hostname}:${port}/`);

});

//http請求

// server.listen(8099,() => {

// const hostname = 'localhost';

// const port = 8099;

// console.log(`Server running at http://${hostname}:${port}/`);

// });

文件目錄:

如果使用博主的方法解決了問題,麻煩在評論區扣個1(方便其他人使用),

如果沒有解決您的問題麻煩扣個2,並提出自己的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章