环境介绍:linux宝塔面板,centos服务器,express应用服务器
一、起因
部署express项目到服务器时,一开始我使用的是http协议,所以可以正常访问,过了一段时间后,我心血来潮,申请了一个https证书,然后为我的网站配置了SSL证书,并成功开启https访问前端页面,由于那时候后台接口还没写好,所以我就没有测试后台接口的请求情况,直到我后台接口写的差不多时,想测试一下,然后开始部署到服务器上面时,发现老是出现下面的错误!
所以我感到很奇怪,明明我申请了https并且在我的宝塔面板上面配置了我的SSL证书,怎么可能无法提供安全链接。
二、原因及解决
所以我百度了很久,终于找到一个答案了:原文戳我
它的帖子成功解决我的问题。但是我还是感到疑惑,明明之前用http可以正常请求,但是换了https请求不了。我记得明明在我的宝塔面板配置了SSL证书,我以为宝塔面板只要配置了,那么整个应用就配置完毕了,没想到后台express也需要配置,感觉这个不太合理啊。按道理说宝塔的配置是针对整个服务器的,宝塔配置好了SSL证书之后,应该整个服务器的链接都升级到了https才对,为什么还需要配置后台应用的ssl证书呢,这个我想不通?
1. 原因解释:
1.1首先使用netstat -ntlp查看开启的端口情况:
可以看到上面的端口前缀分为三种:
(1)0.0.0.0 允许所有的ipv4访问
(2)127.0.0.1(表示本机地址可访问)
(3):::(这个我不知道是什么意思)
所以回到这张图:
我们发现3000端口0.0.0.0并没有开启,所以无法运行所有的ipv4进行访问,所以当我们在公网访问时就会出现:
2. 解决
此时我们需要导入我们的SSL证书,所以需要用到fs进行证书读取,https引入ssl协议。
let express = require(‘express‘) var https=require(‘https‘); var fs=require(‘fs‘); var privateKey=fs.readFileSync(‘./2_humianyuan.cn.key‘); //此处是你的ssl证书文件 私钥文件 var certificate=fs.readFileSync(‘./1_humianyuan.cn_bundle.crt‘);// 此处是你的ssl证书文件 crt文件或者pem都可以 var credentials= {key:privateKey,cert:certificate}; let app = express() var httpsPort = "3000" var httpsServer = https.createServer(credentials,app); httpsServer.listen(httpsPort,‘0.0.0.0‘); // 设置跨域 app.use((req,res ,next) => { res.append(‘Access-Control-Allow-Origin‘,"*") res.append(‘Access-Control-Allow-headers‘,"*") next() }) app.get(‘/‘,(req,res) => { res.json({ msg:"这是首页" }) }) app.get(‘/login‘,(req,res) => { res.send("登录页面,欢迎你!") })
配置好后重启node app.js
再次运行:netstat -ntlp查看开启的端口情况,发现3000端口的来源前缀为:0.0.0.0即允许所有IPV4访问
在浏览器再次请求:
成功开启访问。
三、总结
https虽然是http的加强版,它有利于信息传输的安全,但是使用它必须要做到相应的配置,哪里需要使用到他,哪里就要配置证书