使用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,并提出自己的问题。

发布了21 篇原创文章 · 获赞 24 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_36940740/article/details/105325395