松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程java
原文:https://blog.leapmie.com/archives/418/web
你们都知道 HTTPS 比 HTTP 安全,也据说过与 HTTPS 协议相关的概念有 SSL 、非对称加密、 CA 证书等。算法
但对于如下灵魂三拷问可能就答不上了:浏览器
为何用了 HTTPS 就是安全的?安全
HTTPS 的底层原理如何实现?服务器
用了 HTTPS 就必定安全吗?微信
HTTPS 的实现原理网络
HTTPS 的总体过程分为证书验证和数据传输阶段,具体的交互过程以下:app
浏览器发起 HTTPS 请求。编辑器
服务端返回 HTTPS 证书。
客户端验证证书是否合法,若是不合法则提示告警。
当证书验证合法后,在本地生成随机数。
经过公钥加密随机数,并把加密后的随机数传输到服务端。
服务端经过私钥对随机数进行解密。
服务端经过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。
为何数据传输是用对称加密?
为何须要 CA 认证机构颁发证书?
“中间人攻击”的具体过程以下:
本地请求被劫持(如 DNS 劫持等),全部请求均发送到中间人的服务器。
中间人服务器返回中间人本身的证书。
客户端建立随机数,经过中间人证书的公钥对随机数加密后传送给中间人,而后凭随机数构造对称加密对传输内容进行加密传输。
中间人由于拥有客户端的随机数,能够经过对称加密算法进行内容解密。
中间人以客户端的请求内容再向正规网站发起请求。
由于中间人与服务器的通讯过程是合法的,正规网站经过创建的安全通道返回加密后的数据。
中间人凭借与正规网站创建的对称加密算法对内容进行解密。
中间人经过与客户端创建的对称加密算法对正规内容返回的数据进行加密传输。
客户端经过与中间人创建的对称加密算法对返回结果数据进行解密。
浏览器是如何确保 CA 证书的合法性?
①证书包含什么信息?
颁发机构信息
公钥
公司信息
域名
有效期
指纹
......
②证书的合法性依据是什么?
③浏览器如何验证证书的合法性?
验证域名、有效期等信息是否正确。证书上都有包含这些信息,比较容易完成验证。
判断证书来源是否合法。每份签发证书均可以根据验证链查找到对应的根证书,操做系统、浏览器会在本地存储权威机构的根证书,利用本地根证书能够对对应机构签发证书完成来源验证。
判断证书是否被篡改。须要与 CA 服务器进行校验。
判断证书是否已吊销。经过 CRL(Certificate Revocation List 证书注销列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协议)实现。
其中 OCSP 可用于第 3 步中以减小与 CA 服务器的交互,提升验证效率。
这里插一个我想了好久的但其实答案很简单的问题:既然证书是公开的,若是要发起中间人攻击,我在官网上下载一份证书做为个人服务器证书,那客户端确定会认同这个证书是合法的,如何避免这种证书冒用的状况?
其实这就是非加密对称中公私钥的用处,虽然中间人能够获得证书,但私钥是没法获取的。
一份公钥是不可能推算出其对应的私钥,中间人即便拿到证书也没法假装成合法服务端,由于没法对客户端传入的加密数据进行解密。
④只有认证机构能够生成证书吗?
例如早期的 12306 采用的即是手动安装私有证书的形式实现 HTTPS 访问。
本地随机数被窃取怎么办?
用了 HTTPS 会被抓包吗?
总结
顺手分享一张学习 HTTPS 的过程图:

今日干货
公众号后台回复 2TB,免费获取 2TB Java 学习资料。
你在看吗
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。