閒聊:
如果這是你安裝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}/`);
// });
文件目錄: