You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constexpress=require('express');consthttps=require('https');constfs=require('fs');constpath=require('path');constapp=express();constsslOptions={key: fs.readFileSync(path.resolve('/Users/liyongning/studyspace/ssl','key.pem')),cert: fs.readFileSync(path.resolve('/Users/liyongning/studyspace/ssl','cert.pem'))};app.use((_,res,__)=>{res.send('hello https')})https.createServer(sslOptions,app).listen(8083,()=>{console.log('HTTPS server is running on port 8083');});
当学习成为了习惯,知识也就变成了常识。 感谢各位的 关注、点赞、收藏和评论。
新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn
文章已收录到 github 仓库 liyongning/blog,欢迎 Watch 和 Star。
更多精彩内容
简介
本文采用实战 + 原理的方式来讲述,目的是为了在开发环境使用安全的 https 协议,并了解其背后涉及的原理。
其中的安全是指浏览器不报安全提醒,比如:
在上图所示中,可以通过点击
继续前往
从而忽略浏览器的提示,但我们知道,在陌生网站上这么操作就意味着你离被攻击不远了。但我更希望是这样的效果:不安全的 https 有什么问题??
上图可以通过点击
继续前往
来解决,但有一些场景你绕不过去,比如:service worker 场景
浏览器的 AJAX 请求场景,比如通过 fetch API,请求不安全的 server 会失败,比如 qiankun 主应用加载不安全的子应用,需要先在浏览器中访问子应用,让浏览器忽略子应用的不安全,qiankun 才能正常加载
开发环境如何配置安全的 https 协议
照例,先上结论,后讲原理。主要分为三步:
生成自签名证书
假设以下操作均在
/Users/liyongning/studyspace/ssl
目录完成新建 openssl.cnf 文件,内容如下
其中有几个需要注意的字段
系统 —— 证书
中的名字,比如大家使用时只需更改 DNS.x 或 IP.x 即可。
接下来,执行如下命令生成密钥和证书文件
效果如下,其中 key.pem 是私钥,cert.pem 是证书
信任根证书
将上一步生成的 cert.pem 放到根证书列表中,操作如下
Mac
Command + 空格,搜索
钥匙串访问
,并打开找到系统钥匙串 -> 系统 -> 证书
将 cert.pem 文件拖进来,在列表中能看到一条名为 self-signed-certificate 的记录
右键这条记录 -> 显示简介,得到如下界面,将
使用此证书时
的选项更换为始终信任
,然后关闭当前窗口(一定要关闭,关闭才能保存)上述所有 Mac 步骤也可以通过如下命令直接搞定:
Windows
Cmd 命令行输入
也可以采用双击 cert.pem 文件进行安装
项目集成
Vite 项目
配置 vite.config.js
效果如下:
Webpack 项目
以 vue-cli 为例,配置 vue.config.js
效果如下
Node 项目
效果如下
至此,自签名证书制作和实际应用都讲完了,接下来的内容就是其中涉及的原理了。
HTTPS 发展史
http 协议最开始的设计目的很简单,就是传输超文本文件(HTML),没有什么加密的需求,所有数据都是明文传输,这就意味数据在传输过程的每个环节都可能被窃取和篡改。
这个情况严重制约了业务的发展,比如在线购物、支付转账,毫无安全可言,于是在协议栈中引入了安全层,负责数据的加解密,让数据传输更安全。
可以看到,HTTPS 并不是一个新的协议,只是在 HTTP 层和 TCP 之间加入了一层加解密的逻辑,以前是 HTTP 直接和 TCP 通信,现在是 HTTP -> TSL(SSL 早已废弃)-> TCP,安全层负责对经过的数据进行加解密。所以,HTTPS 的发展史就是安全层逻辑的迭代史。
对称加密
对称加密,就是客户端和服务端使用同一个密钥来进行加解密。那么,问题来了,这个密钥怎么来?答案是:由服务端和客户端使用相同的加密方法、key(随机数)计算得到,在正式传输数据之前,浏览器和服务器之间会有一个协商加解密方式的过程,这个过程就是 HTTPS 建立安全连接的过程:
但这时你会发现,虽然,最终的数据全是通过密钥加密传输的,但是生成密钥时使用的加密方法、随机数都是明文传输的,中间人使用相同的方法和随机数同样可以生成相同的密钥,进而解密 -> 窃取、篡改、伪造 -> 加密数据,所以,一样不安全。
非对称加密
非对称加密和对称加密相对,分为私钥和公钥两个密钥,加解密使用的是两个不同的密钥,公钥加密的数据只能使用私钥解密,私钥加密的数据同样只能使用公钥解密。
接下来,我们分析下整个流程中的数据安全性:
所以,性能差还不能绝对安全。
非对称加密 + 对称加密
意思是,同时采用两种加密方式来保证数据的安全性。协商阶段采用非对称加密的方式,数据传输阶段使用对称加密的方式,通过这样的方式来保证数据传输性能和对称密钥的安全性,即前两种方式的结合版。
这个方案的关键在于非对称密钥 + 双随机数的方式,保证了对称密钥的安全,进而解决了数据安全问题。
数字证书
通过非对称加密 + 对称加密结合的方式,我们实现了数据的加密传输。但是,这套方案还存在一个漏洞 —— 中间人攻击。
**浏览器访问的服务器,一定是真的目标服务器吗?**比如,你访问
baidu.com
,如果你的 DNS 解析被人改了,baidu 的流量被解析到了攻击者的服务器上,上述整体流程就变成了:浏览器 -> 黑客服务器 -> 目标服务器,这三者之间的通信了,即浏览器和目标服务器之间的所有通信都是通过黑客服务器来完成中转的,包括随机数和密钥的传输,即:那有什么方案,可以让浏览器知道自己现在访问的服务器是真正的目标服务器吗?这里我们需要引入一个第三方机构。
以买房为例,你怎么证明你现在居住的房子是你自己的房子?我们可以通过房管局发放的房产证来证明。这里引入具有权威的房管局,以及房管局颁发的房产证,大众信任房管局,所以当你出示房产证的时候,就可以证明这个房子确实是你的房子。
同理,在 HTTP 通信的过程里,我们引入权威机构 —— CA(Certificate Authority),CA 颁发的证书就是数字证书。
相较于上一个方案,这里引入了数字证书的概念,数字证书有两个作用:
可以看到,流程中多了一步验证数字证书的流程。
数字证书的申请
浏览器数字证书
浏览器通过验证数字证书,从而得到自己访问的服务器是否为正确的目标服务器。
浏览器从服务器拿到数字证书后:
这里有个问题,**CA 机构的公钥怎么来的?**这个证书有两种获取途径,一是从目标服务器返回,另一个是从网络下载(你从浏览器的请求列表中看不到对应的请求)。
会不会有人冒充 CA 机构 ??
首先,答案是不会。逻辑是这样的:
CA 结构分为根 CA 和 中间 CA,大家都是去中间 CA 去申请证书,而根 CA 是负责给中间 CA 做认证的,而这些中间 CA 又可以去给其他 CA 做认证,这些每个根 CA 都维护了一棵 CA 树,比如:
admin.saas.360 的证书是由 WoTrus DV Server CA 颁发的,而这个中间 CA 又是由 USERTrust RSA Certification Authority 来负责认证的。
所以,这里有一个证书链,浏览器会首先验证 admin.saas.360.cn 的证书是否合法,如果验证通过,再去验 WoTrus DV Server CA 的合法性,如果也合法,再去验证 USERTrust RSA Certification Authority 根 CA 的合法性。
那么问题来,最终的**根 CA 合法性如何验证?**很简单,只需要判断这个根证书在不在操作系统中即可,这些根证书是内置在每个操作系统中的,如果系统中存在,则认为合法,否则就是不合法的。
相信读到这里,你就能理解本文 开发环境配置安全的 HTTPS 协议 的背后原理了。
如果某个机构想要成为根 CA,并让它的根证书内置到操作系统中,那么这个机构首先要通过 WebTrust 国际安全审计认证。
HTTPS 就绝对安全吗??
这是 HTTPS 认证流程面试题结束时必问的一个问题。答案是:否,HTTPS 不是绝对安全。
相信,读完本文,你就能很清晰的说出来其中的不安全点了:
好了,到这里就结束了,相信阅读完本文之后:
总结
本文从实用角度开始讲,讲了在日常的开发环境中如何配置安全的 HTTPS 协议,即浏览器中没有安全提示
接下来讲了 HTTPS 的发展史,对称加密、非对称加密、非对称加密 + 对称加密,再到数字证书,从而理解其中的整个原理。
最后讲了一道面试题:**HTTPS 就绝对安全吗?**从而验证对原理的理解程度。
当学习成为了习惯,知识也就变成了常识。 感谢各位的 关注、点赞、收藏和评论。
新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn
文章已收录到 github 仓库 liyongning/blog,欢迎 Watch 和 Star。
更多精彩内容
The text was updated successfully, but these errors were encountered: