HTTPS详解

前言

1990年互联网诞生之初,就已经开始用超文本传输协议HTTP传输数据,这也是为什么现在网页地址都是以http开头的原因。但是HTTP协议传输数据是明文传输,任意的人抓包就能看到传输的数据,这显然不安全。1994年,Netscape公司用加密协议增加了HTTP,开始在HTTP的基础上加入SSL(Secure Socket Layer)。称为"HTTP over SSL"或者"HTTP Secure",也就是我们现在熟知的HTTPS。

SSL/TLS

SSL/TLS是位于TCP/IP 7层协议中的会话层,用于认证用户和服务器,加解密数据以及维护数据的完整性,确保数据在传输过程中不会被修改。

TLS(Transport Layer Security,传输层安全协议)是IETF制定的一种新的协议,TLS1.0是建立在SSL3.0协议规范之上,是SSL3.0协议的后续版本,可以理解为SSL3.1。TLS的主要目的是使SSL更加安全,更加完善。TLS记录格式于SSL记录格式相同,但是版本号值不一样,TLS的版本1.0使用的版本号是SSLv3.1。

SSL/TLS分为对称加密和非对称加密两种方式。

对称加密

对称加密是指加密和解密都用同一份密钥。如下图所示:

常用的对称加密算法有AES-128,AES-192,AES-256。

非对称加密

非对称加密对应于一对密钥,称为私钥和公钥,用私钥加密后需要用公钥解密,用公钥加密后需要用私钥解密。如下图所示:

对称加密的优点是运算速度快,缺点是互联网环境下无法将密钥安全的传送给对方。非对称加密的优点是可以安全的将公钥传递给对方,但是运算速度慢。

那么HTTPS究竟是采用对称加密还是非对称加密呢?答案是两者都有。先采用非对称加密传输协商对称加密的密钥,然后用对称加密通信。

HTTPS加密过程

上图是比较粗粒度的讲解了HTTPS的非对称和对称加解密过程:

  1. 客户端浏览器发起连接。
  2. WEB服务器将公钥发给客户端。
  3. 客户端生成一个session key,并且将session key用公钥加密后发送给服务器。
  4. 服务器用私钥将session key解密出来。
  5. 客户端和服务器用session key做对称加密通信。

整个流程可以这样抽象,但是实际上session key的生成是需要多次协商的结果(文章后面会讲到),我们暂且这样简单的理解。整个流程会有一个问题,第2步中WEB服务器发给客户端的公钥,万一被中间人修改了呢,换句话说,客户端怎么验证公钥的正确性呢?那就需要讲到数字签名。

数字签名

如上图所示,公钥内容的后面是会跟上一个数字签名,该数字签名是将公钥内容的HASH用私钥加密后的密文。客户端拿到公钥后,会用相同的HASH算法重新算一遍,得到一个HASH值hash1。然后用公钥解密数字签名得到HASH值hash2,如果hash1等于hash2就证明这个公钥是没有被中间人修改的。即使中间人修改了公钥的内容,他也没有私钥可以重新生成数字签名,用户拿到修改后的公钥一算发现HASH不对就会报错。

TLS握手过程

Client Hello. 客户端通过发送Client Hello消息给服务器初始化Session连接。

Client Hello 消息包含以下字段:

  • SSL/TLS 版本号。version 2 表示的是SSL 2.0,version 3 表示的是SSL 3.0,version 3.1表示的是TLS 1.0。
  • 随机数Random_C。一共32个字节。前面4个字节是当前时间戳,后面28个字节是一个随机数。后面协商对称加密的Session Key会用到。
  • Session ID。如果是之前已经存在的连接重连,那么Session ID会是一串数字,否则是None。
  • Cipher Suite。支持的加密组件列表。例如TLS_RSA_WITH_DES_CBC_SHA, TLS 是TLS协议版本,TLS表示TLS1.0,RSA是密钥交换算法,DES_CBC是加密算法,SHA是摘要算法。
  • 压缩算法。表示建议选用的是哪种压缩算法。

Client Hello 消息示例:

ClientVersion 3,1
ClientRandom[32]
SessionID: None (new session)
Suggested Cipher Suites:
   TLS_RSA_WITH_3DES_EDE_CBC_SHA
   TLS_RSA_WITH_DES_CBC_SHA
Suggested Compression Algorithm: NONE

Server Hello. 服务器收到客户端的Client Hello 消息会响应一个Server Hello 消息,包括以下字段:

  • SSL/TLS 版本,客户端和服务器都支持的SSL/TLS最高版本。
  • 随机数Random_S,一共32个字节,前面4个字节是当前时间戳,后面28个字节是一个随机数。后面协商对称加密的Session Key会用到。
  • Session ID,这里会有三种情况。1.产生一个新的Session ID,表示没有找到之前的Session ID或者之前没有这个Session ID。2. 返回客户端带上的之前的Session ID。(断链重连)3.Null,服务器没有办法产生新的Session ID。
  • Cipher Suite,服务器从刚才Client Hello消息的Cipher Suite加密列表中选中的加密组件。
  • 压缩算法,表示选中的是哪种压缩算法。

Server Hello 消息示例:

Version 3,1
ServerRandom[32]
SessionID: bd608869f0c629767ea7e3ebf7a63bdcffb0ef58b1b941e6b0c044acb6820a77
Use Cipher Suite:
TLS_RSA_WITH_3DES_EDE_CBC_SHA
Compression Algorithm: NONE

服务器发完Sever Hello 后还会发送下面几条消息:

Server Certificate.服务器发给客户端的证书,包含公钥。客户端后面会用该密钥加密premaster secret。客户端也会校验证书的合法性,比如证书包含的域名是否就是客户端正在访问的域名。

Server Key Exchange.[可选]当服务器的证书不包含公钥时,客户端会用它来加密后面的Client Key Exchange消息。

Client Certificate Request.[可选]用于服务器需要验证客户端身份的情况,例如银行系统通常用U盾来证明客户端的身份。

Server Hello Done.表示Server已经发送消息完毕并且在登陆客户端回复。

客户端紧接着响应给服务器的消息:

Client Certificate.[可选]客户端证书,包括客户端的公钥。响应上面的Client Certificate Request。

Client Key Exchange.该消息包括premaster secret,TLS的版本号,再次带上版本号是因为之前的版本号是明文传输的,攻击者可能会恶意修改为较低的版本号,从而降低连接的安全系数方便发起攻击。该消息字段会用公钥加密。现在一共有Random_C,Random_S, premaster secret三个随机数,客户端和服务器端会用相同的算法,用这三个随机数作为参数,从而计算得到另外的一个随机数,即后面对称加密的密钥Session Key。

Certificate Verify.[可选]该消息只针对有Client Certificate的情况。会计算出该消息字段的HASH,然后用客户端的私钥加密该HASH作为签名。服务器端会使用Client Certificate消息中得到的客户端公钥解密并验证这条消息的合法性。

Change Cipher Suite.该消息通知服务器接下来的Client Finish消息将会用刚才协商的密钥Session Key来加密。

Client Finished.该消息会列举客户端上面用到的所有加密字段,并且算出他们的HASH值,然后用Session Key加密。

服务器在握手阶段最后回应给客户端的消息:

Change Cipher Suite Message.该消息通知客户端接下来的消息会用Session Key来加密。

Sever Finished Message. 对整个协商阶段用到的字段算一个HASH,然后用Session Key加密。

总结

文章首先介绍了HTTPS的由来,然后介绍了对称加密和非对称加密,以及HTTPS的加解密过程,最后详细的讲解了TLS的握手过程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安富莱嵌入式技术分享

基于MbedTLS的AES加密实现,含STM32H7和STM32F4的实现例程

主要提供了的SSL/TLS支持(在传输层对网络进行加密),各种加密算法,各种哈希算法,随机数生成以及X.509(密码学里公钥证书的格式标准)的支持。

19020
来自专栏Jerry的SAP技术分享

SAP Kyma SSL证书请求文件(CSR)生成逻辑

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

12820
来自专栏安信SSL证书

SSL证书是什么?SSL证书怎么申请?

  SSL证书是数字证书的一种,由权威数字证书机构(CA)验证网站身份后颁发,可实现浏览器和网站服务器数据传输加密。网站安装SSL证书后会在浏览器显示安全锁标志...

20760
来自专栏前端菜鸟变老鸟

HTTPS详细介绍

HTTP协议因为其轻、小、快、简单,所以在全世界普及开来,各种应用都离不开它。但是随着业务复杂度的提高,HTTP的这些优点逐渐成为了短板。所以就开始各种打补丁,...

16730
来自专栏安信SSL证书

https安全证书如何申请 https证书申请流程及费用

  随着谷歌、百度等主流浏览器大力支持鼓励网站安装SSL证书进行https加密,保障网站安全,网站安装https证书已经成为一种趋势。那么,https安全证书如...

25530
来自专栏后端开发你必须学会的干货

快速了解Https

HTTPS:https是http与ssl的结合,为了解决http明文传输导致信息泄露的问题。ssl通过公钥和私钥保证客户端和服务器之间的通讯加密,由权威机构办法...

10450
来自专栏用户5745643的专栏

DDOS攻击常见的类型

“互联网”指的是全球性的信息系统,是能够相互交流,相互沟通,相互参与的互动平台。随着互联网的飞速发展,越来越多的网站应运而生,但各种问题也随之而来。其中最严重的...

12530
来自专栏FreeBuf

HTTPS劫持研究

哈萨克斯坦政府最近开始使用一个假的根证书颁发机构,对包括Facebook,Twitter和Google等网站在内的HTTPS连接进行中间人(MitM)攻击,在此...

14720
来自专栏JadePeng的技术博客

Docker启用TLS进行安全配置

之前开启了docker的2375 Remote API,接到公司安全部门的要求,需要启用授权,翻了下官方文档

10020
来自专栏Jerry的SAP技术分享

PHP使用curl发送HTTP请求时,如何使用本地的SSL证书

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

9320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励