HTTPS加密过程和TLS证书验证

HTTPS 是在 HTTP 和 TCP 之间建立了一个安全层,HTTP 与 TCP 通信的时候,必须先进过一个安全层,对数据包进行加密,然后将加密后的数据包传送给 TCP,相应的 TCP 必须将数据包解密,才能传给上面的 HTTP。

浏览器传输一个 client_random 和加密方法列表,服务器收到后,传给浏览器一个 server_random、加密方法列表和数字证书(包含了公钥),然后浏览器对数字证书进行合法验证,如果验证通过,则生成一个 pre_random,然后用公钥加密传给服务器,服务器用 client_random、server_random 和 pre_random ,使用公钥加密生成 secret,然后之后的传输使用这个 secret 作为秘钥来进行数据的加解密

作者:图雀社区
链接:https://juejin.cn/post/6939691851746279437
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

前言

大家都知道,苹果在2016年WWDC上宣布了关于应用需要强制使用HTTPS的规定。这也算是个好消息吧,虽然开发者们可能需要适配下HTTPS,但是我们的应用可算是披上一个安全的保护罩了。本篇文章就算是笔者在学习HTTPS过程中的一个记录吧。

HTTPS加密过程

最近重新了解了下HTTPHTTPS: 首先二者都是网络传输协议;HTTPS在传输过程中是可以通过加密来保护数据安全的,以免用户敏感信息被第三方获取。 可以说HTTPSHTTP的升级版、安全版。下面我们就简单看下HTTPS的加密过程,先看下图。

  1. 客户端发起HTTPS请求 这个没什么好说的,就是用户在浏览器里输入一个HTTPS网址,然后连接到服务端的443端口。
  2. 服务端的配置 采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。如果对公钥不太理解,可以想象成一把钥匙和一个锁头,只是世界上只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
  3. 传送证书 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
  4. 客户端解析证书 这部分工作是由客户端的SSL/TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警示框,提示证书存在的问题。如果证书没有问题,那么就生成一个***随机值***。然后用证书(也就是公钥)对这个随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
  5. 传送加密信息 这部分传送的是用证书加密后的随机值,目的是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
  6. 服务端解密信息 服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该随机值进行对称加密,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
  7. 传输加密后的信息 这部分信息就是服务端用私钥加密后的信息,可以在客户端用随机值解密还原。
  8. 客户端解密信息 客户端用之前生产的私钥解密服务端传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。

到了这里,HTTPS的整个加密过程也就差不多完成了,但是这个过程中是不是还有些概念还是不太清楚,比如SSL是什么,TLS又是什么,他们是怎么验证我们的证书是否有效的呢,它们的验证策略又是怎样的呢。别急,下面我们就讨论下TLS

TLS

刚开始听到TLS的时候,你可能还不太熟悉,但是说起SSL你可能就觉得好耳熟了。其实TLS就是从SSL发展而来的,只是SSL发展到3.0版本后改成了TLS

TLS主要提供三个基本服务

  • 加密
  • 身份验证,也可以叫证书验证吧~
  • 消息完整性校验

第三个是网络协议中常用的一个校验和机制,我这我们就先按下不表。

加密

我们再看一遍客户端和服务端之间的加密机制:

TLS协议是基于TCP协议之上的,图中第一个蓝色往返是TCP的握手过程,之后两次橙色的往返,我们可以叫做TLS的握手。握手过程如下:

  1. client1TLS版本号+所支持加密套件列表+希望使用的TLS选项
  2. Server1:选择一个客户端的加密套件+自己的公钥+自己的证书+希望使用的TLS选项+(要求客户端证书);
  3. Client2:(自己的证书)+使用服务器公钥和协商的加密套件加密一个对称秘钥(自己生成的一个随机值);
  4. Server2:使用私钥解密出对称秘钥(随机值)后,发送加密的Finish消息,表明完成握手

这里可能要提一下什么是对称加密和非对称加密: 一般的对称加密像这样:

encrypt(明文,秘钥) = 密文
decrypt(密文,秘钥) = 明文
复制代码

也就是说加密和解密用的是同一个秘钥。而非对称加密是这样的:

encrypt(明文,公钥) = 密文
decrypt(密文,私钥) = 明文
复制代码

加密和解密是需要不同的秘钥的。

经过这几次握手成功后,客服端和服务端之间通信的加密算法和所需要的密钥也就确定下来了,之后双方的交互都可以使用对称加密算法加密了。

证书机制/证书验证

TLS中,我们需要证书来保证你所访问的服务器是真实的,可信的。 看这张图我们来讨论下证书的验证过程。

  1. 客户端获取到了站点证书,拿到了站点的公钥;
  2. 要验证站点可信后,才能使用其公钥,因此客户端找到其站点证书颁发者的信息;
  3. 站点证书的颁发者验证了服务端站点是可信的,但客户端依然不清楚该颁发者是否可信;
  4. 再往上回溯,找到了认证了中间证书商的源头证书颁发者。由于源头的证书颁发者非常少,我们浏览器之前就认识了,因此可以认为根证书颁发者是可信的;
  5. 一路倒推,证书颁发者可信,那么它所颁发的所有站点也是可信的,最终确定了我们所访问的服务端是可信的;
  6. 客户端使用证书中的公钥,继续完成TLS的握手过程。

那么,客户端是是如何验证某个证书的有效性,或者验证策略是怎样的?

证书颁发者一般提供两种方式来验证证书的有效性: CRL 和 OCSP

CRL

CRL(Certificate Revocation List)即 证书撤销名单。证书颁发者会提供一份已经失效证书的名单,供浏览器验证证书使用。当然这份名单是巨长无比的,浏览器不可能每次TLS都去下载,所以常用的做法是浏览器会缓存这份名单,定期做后台更新。这样虽然后台更新存在时间间隔,证书失效不实时,但一般也OK。

OCSP

OCSP(Online Certificate StatusProtocol)即 在线证书状态协议。除了离线文件,证书颁发者也会提供实时的查询接口,查询某个特定证书目前是否有效。实时查询的问题在于浏览器需要等待这个查询结束才能继续TLS握手,延迟会更大。

以上是站点在证书颁发者的角度说明会提供的两种判断方式,实际情况下浏览器究竟会选择哪种方式判断,每个浏览器都会有自己的实现。下面是通过Chrome查看GitHub网站的证书信息:

到这里差不多了,有什么不对的地方,欢迎大家留言指出,一起学习进步!

笔者不才,有些地方还是理解不到位,若有不正之处,还请耐心指出,轻喷~。

HTTPS加密过程和TLS证书验证 - 掘金

一个故事讲完https

HTTPS加密过程和TLS证书验证相关推荐

  1. SSL/TLS协议的运行原理浅析—https通信过程及CA证书诠释

    互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度.而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL TLS协议变得异常复杂.理清https原理与CA证书体系 互联网的通信 ...

  2. Android https 自签名和CA证书验证(基于OkHttp)

    Android HTTPS自签名和CA证书验证(基于OkHttp) HTTPS介绍 CA证书 自签名证书 问题描述 域名校验 OkHttp设置 总结 HTTPS介绍 HTTPS是一种通过计算机网络进行 ...

  3. HTTPS加密过程详解

    HTTPS加密过程详解 一.前言 二.HTTPS的混合加密 1.摘要算法 2.混合加密和数字证书 三.补充 四.参考资料 一.前言 http是为了解决http存在的问题而在http基础上加入了SSL/ ...

  4. HTTPS 加密过程详解

    HTTPS 加密过程详解 HTTPS 中的概念 对比 HTTP 与 HTTPS 网络分层结构 对称加密 非对称加密 HTTPS 中的概念 明文:可以直接看到原始数据的文本: 密文:看不见原始数据的文本 ...

  5. 最简单的HTTPS加密过程简介

    HTTPS协议其实就是HTTP over TSL,TSL(Transport Layer Security) 传输层安全协议是https协议的核心. TSL可以理解为SSL (Secure Socke ...

  6. http、https加密过程

    http: 超文本传输协议,是一个基于请求与响应,无状态无连接的,应用层的协议,常基于TCP/IP协议传输数据 <协议>://<域名>:<端口>/<路径> ...

  7. JAVA使用HttpURLConnection请求HTTPS网站,不需要证书验证的DEMO教程

    最近在获取一个购物网站商品,发现浏览器和postman每次都可以请求到内容,但是java代码尝试了各种方式都是Connection refused: connect,一开始以为是java代码的问题,后 ...

  8. HttpClient访问https,设置忽略SSL证书验证

    访问https时报错:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provid ...

  9. ssl握手过程和ca证书验证

    转载:https://www.cnblogs.com/cposture/p/9029014.html SSL 认证 可以将 SSL 服务器与客户端之间的通信配置为使用单向或双向 SSL 认证. 单向 ...

最新文章

  1. python数据池连接PG
  2. matlab GUI 实现按钮切换plot页面(含clear功能)
  3. Spring Ioc注解式开发中注解的作用
  4. 另存为常用位置设置 1.0 绿色版
  5. derby mysql 同步_[Derby]数据库操作说明
  6. python-列表包字典-根据字典的某一个键的值来进行排序
  7. 不能将参数转化为lparam_如何将管理需求转化为信息化方案
  8. SQL命令向表中添加列
  9. 提示,请选择有效的文件
  10. Android新浪微博开发(3)JSon解析
  11. 使用opennlp进行词性标注
  12. mysql 1048_MySQL Error 1048 奇遇记-阿里云开发者社区
  13. 找出直系亲属 研究生机试 树
  14. 如何绘制论文中的图表
  15. 万兆单模模块_万兆(10G SFP+)单模光模块的介绍及应用
  16. ‘class QFontMetrics‘ has no member named ‘horizontalAdvance‘
  17. gltf中的bufferViews,accessors和buffers
  18. 支付宝小程序获取位置API没有城市区号的最佳处理方案
  19. 三人表决电路——Verilog HDL语言
  20. phpstorm许可证_PhpStorm 8发布-查看新功能并获取免费许可证

热门文章

  1. python3 pdf书_用python3在PDF上书写文本
  2. JavaScript 脚本
  3. baocms伪静态_最新BAOCMS 6.2本地O2O生活门户系统多城市完整版源码下载 贴吧圈子+缴费服务+政务活动+微信等...
  4. 记录使用centos7桌面版-倍洽 Linux 版
  5. Linux云计算架构
  6. AVPlayer的用法
  7. 【十五、网站公安备案】2021最详细wordpress博客建站教程(2021.03.04更新)
  8. matlab 代码分析 内存溢出,matlab内存溢出的解决方案
  9. amd k14主板参数_amd k14主板能换cpu吗?
  10. nodejs glup打包工程问题