转自

https://linux.cn/article-6804-1.html

目标读者:理解HTTP协议,对称和非对称加密,想要了解HTTPS协议的工作原理。

读完本文,你能明白

  • 什么是HTTPS,TLS(SSL),TLS和HTTPS是什么关系?
  • 什么是证书和数字签名,它们是如何传递信任的?
  • HTTPS有什么样的功能,它是如何实现这样的功能的?

简介

HTTPS,也称作HTTP over TLS。TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。本文着重描述TLS协议的1.2版本。

下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系

Credit: Kaushal Kumar Panday From: SSL Handshake and HTTPS Bindings on IIS

其中Handshake protocol,Change Ciper Spec protocol和Alert protocol组成了SSL Handshaking Protocols。

HTTPS和HTTP协议相比提供了

  1. 数据完整性:内容传输经过完整性校验
  2. 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
  3. 身份认证:第三方无法伪造服务端(客户端)身份

其中,数据完整性和隐私性由TLS Record Protocol保证,身份认证由TLS Handshaking Protocols实现。

总览

使用RSA算法的SSL握手过程是这样的:

Source: Keyless SSL: The Nitty Gritty Technical Details

  1. [明文] 客户端发送随机数client_random和支持的加密方式列表
  2. [明文] 服务器返回随机数server_random,选择的加密方式和服务器证书链
  3. [RSA] 客户端验证服务器证书,使用证书中的公钥加密premaster secret发送给服务端
  4. 服务端使用私钥解密premaster secret
  5. 两端分别通过client_randomserver_randompremaster secret生成master secret,用于对称加密后续通信内容

证书Digital certificate

那么什么是证书呢?

证书中包含什么信息:

  • 证书信息:过期时间和序列号
  • 所有者信息:姓名等
  • 所有者公钥

为什么服务端要发送证书给客户端?

互联网有太多的服务需要使用证书来验证身份,以至于客户端(操作系统或浏览器等)无法内置所有证书,需要通过服务端将证书发送给客户端。

客户端为什么要验证接收到的证书?

中间人攻击

 
  1. 客户端<------------攻击者<------------服务端
  2. 伪造证书 拦截请求

客户端如何验证接收到的证书?

为了回答这个问题,需要引入数字签名Digital Signature。

 
  1. +---------------------+
  2. | A digital signature |
  3. |(not to be confused |
  4. |with a digital |
  5. |certificate) | +---------+ +--------+
  6. | is a mathematical |----哈希--->| 消息摘要 |---私钥加密--->| 数字签名 |
  7. |technique used | +---------+ +--------+
  8. |to validate the |
  9. |authenticity and |
  10. |integrity of a |
  11. |message, software |
  12. |or digital document. |
  13. +---------------------+

将一段文本通过哈希hash和私钥加密处理后生成数字签名。

假设消息传递在Bob,Susan和Pat三人之间发生。Susan将消息连同数字签名一起发送给Bob,Bob接收到消息后,可以这样验证接收到的消息就是Susan发送的

 
  1. +---------------------+
  2. | A digital signature |
  3. |(not to be confused |
  4. |with a digital |
  5. |certificate) | +---------+
  6. | is a mathematical |----哈希--->| 消息摘要 |
  7. |technique used | +---------+
  8. |to validate the | |
  9. |authenticity and | |
  10. |integrity of a | |
  11. |message, software | 对
  12. |or digital document. | 比
  13. +---------------------+ |
  14. |
  15. |
  16. +--------+ +---------+
  17. | 数字签名 |---公钥解密--->| 消息摘要 |
  18. +--------+ +---------+

当然,这个前提是Bob知道Susan的公钥。更重要的是,和消息本身一样,公钥不能在不安全的网络中直接发送给Bob。

此时就引入了证书颁发机构Certificate Authority,CA,CA数量并不多,Bob客户端内置了所有受信任CA的证书。CA对Susan的公钥(和其他信息)数字签名后生成证书。

Susan将证书发送给Bob后,Bob通过CA证书的公钥验证证书签名。

Bob信任CA,CA信任Susan 使得 Bob信任Susan,信任链Chain Of Trust就是这样形成的。

事实上,Bob客户端内置的是CA的根证书Root Certificate,HTTPS协议中服务器会发送证书链Certificate Chain给客户端。

TLS协议

TLS协议包括TLS Record Protocol和TLS Handshake Protocol。总览中的流程图仅涉及到TLS Handshake Protocol。

TLS Record Protocol

在TLS协议中,有四种子协议运行于Record protocol之上

  • Handshake protocol
  • Alert protocol
  • Change cipher spec protocol
  • Application data protocol

Record protocol起到了这样的作用

  • 在发送端:将数据Record分段,压缩,增加MAC(Message Authentication Code)和加密
  • 在接收端:将数据Record解密,验证MAC,解压并重组

值得一提的是,Record protocol提供了数据完整性和隐私性保证,但Record类型type和长度length是公开传输的

Record Protocol有三个连接状态Connection State,连接状态定义了压缩,加密和MAC算法。所有的Record都是被当前状态Current State确定的算法处理的。

TLS Handshake Protocol和Change Ciper Spec Protocol会导致Record Protocol状态切换。

 
  1. empty state -------------------> pending state ------------------> current state
  2. Handshake Protocol Change Cipher Spec

初始当前状态Current State没有指定加密,压缩和MAC算法,因而在完成TLS Handshaking Protocols一系列动作之前,客户端和服务端的数据都是明文传输的;当TLS完成握手过程后,客户端和服务端确定了加密,压缩和MAC算法及其参数,数据Record会通过指定算法处理。

其中,Record首先被加密,然后添加MAC(message authentication code)以保证数据完整性。

TLS Handshaking Protocols

Handshakeing protocols包括Alert Protocol,Change Ciper Spec Protocol和Handshake protocol。本文不会详细介绍Alert Protocol和Change Ciper Spec Protocol。

使用RSA算法的握手过程是这样的(已在总览中提到)

Source: Keyless SSL: The Nitty Gritty Technical Details

客户端和服务端在握手hello消息中明文交换了client_randomserver_random,使用RSA公钥加密传输premaster secret,最后通过算法,客户端和服务端分别计算master secret。其中,不直接使用premaster secret的原因是:保证secret的随机性不受任意一方的影响。

除了使用RSA算法在公共信道交换密钥,还可以通过Diffie–Hellman算法。Diffie–Hellman算法的原理是这样的:

By Original schema: A.J. Han Vinck, University of Duisburg-Essen SVG version: Flugaal [Public domain], via Wikimedia Commons

使用Diffie–Hellman算法交换premaster secret的流程

Source: Keyless SSL: The Nitty Gritty Technical Details

小结

TLS Handshaking Protocols协商了TLS Record Protocol使用的算法和所需参数,并验证了服务端身份;TLS Record Protocol在协商后保证应用层数据的完整性和隐私性。

TLS Handshaking Protocol的核心是在公开信道上传递premaster secret

Q&A

为什么传输内容不直接使用非对称加密?

性能

HTTPS能保证正常连接?

no

There are a number of ways in which a man-in-the-middle attacker can attempt to make two entities drop down to the least secure method they support.

攻击者甚至可以直接丢弃双方的数据包。

服务端如何验证客户端身份?

通过Client Certificate

This message conveys the client's certificate chain to the server; the server will use it when verifying the CertificateVerify message (when the client authentication is based on signing) or calculating thepremaster secret (for non-ephemeral Diffie- Hellman). The certificate MUST be appropriate for the negotiated cipher suite's key exchange algorithm, and any negotiated extensions.

Alert protocol有什么作用?

Closure Alerts:防止Truncation Attack

In a truncation attack, an attacker inserts into a message a TCP code indicating the message has finished, thus preventing the recipient picking up the rest of the message. To prevent this, SSL from version v3 onward has a closing handshake, so the recipient knows the message has not ended until this has been performed.

Error Alerts:错误处理

master secret是如何计算的

 
  1. master_secret = PRF(pre_master_secret, "master secret",
  2. ClientHello.random + ServerHello.random)
  3. [0..47];

加密,压缩和MAC算法参数是如何计算的

Handshaking Protocols使得客户端和服务端交换了三个参数:client_randomserver_randommaster_secret,通过以下算法生成算法所需要的参数

 
  1. To generate the key material, compute
  2. key_block = PRF(SecurityParameters.master_secret,
  3. "key expansion",
  4. SecurityParameters.`server_random ` +
  5. SecurityParameters.`client_random`);
  6. until enough output has been generated. Then, the key_block is
  7. partitioned as follows:
  8. client_write_MAC_key[SecurityParameters.mac_key_length]
  9. server_write_MAC_key[SecurityParameters.mac_key_length]
  10. client_write_key[SecurityParameters.enc_key_length]
  11. server_write_key[SecurityParameters.enc_key_length]
  12. client_write_IV[SecurityParameters.fixed_iv_length]
  13. server_write_IV[SecurityParameters.fixed_iv_length]

The master secret is expanded into a sequence of secure bytes, which is then split to a client write MAC key, a server write MAC key, a client write encryption key, and a server write encryption key

使用Diffie-Hellman算法的TLS握手细节

Source: https://cipherstuff.wordpress.com/

拓展阅读

  • Keyless
  • Let's Encrypt
  • Session resume
  • 证书Revoke

参考链接

  1. TLS1.2规范:The Transport Layer Security (TLS) Protocol Version 1.2
  2. 证书和数字签名:What is a Digital Signature?
  3. TLS Handshake:Keyless SSL: The Nitty Gritty Technical Details

理解 HTTPS 的工作原理相关推荐

  1. [diango]理解django视图工作原理

    前言:正确理解django视图view,模型model,模板的概念及其之间的关联关系,才能快速学习并上手使用django制作网页 本文主要讲解自己在学习django后对视图view的理解 在进入正文之 ...

  2. HTTPS的工作原理

    内容有点多,但干货满满,相信我,你一定会有收获! 在正式开始讲解https之前我们还得先搞清楚两个概念:什么是对称加密,以及什么是非对称加密? 对称加密的介绍 对称加密比较简单,就是客户端和服务器共用 ...

  3. eja智能压力变送器工作原理_如何理解智能压力变送器工作原理及功能介绍

    如何理解智能压力变送器工作原理及功能介绍 智能压力变送器一般是由传感器.微处理器.存储器及模数.数模转换器组成.传感器用来检测被测量的信号,其所用材料因厂家而异.横河EJA为硅谐振式,把被测参数转换为 ...

  4. 通过自制CPU来彻底理解CPU的工作原理

    每天摸着CPU,摸了20多年,却总是无法彻底理解CPU的工作原理,还有比这更郁闷的事吗?所以我决定攻克这一世界(我个人的世界)难题,自己做一个CPU来理解CPU的工作原理. " 造一个什么样 ...

  5. 面试:说说 HTTPS 的工作原理?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 |  stephanietang.github.i ...

  6. HTTPS 的工作原理

    我们都知道 HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议. http与https区别 https工作原理 1.客户端发 ...

  7. 理解ABR及其工作原理

    点击上方"LiveVideoStack"关注我们 翻译 | Alex 技术审校 | 赵军 本文来自OTTVerse,作者为Krishna Rao Vijayanagar. ABR ...

  8. 用一个实际例子理解Docker volume工作原理

    要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...

  9. 用一个实际例子理解Docker volume工作原理 1

    要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...

最新文章

  1. Spring源码分析【7】-Spring 模板页和JSP文件的编译
  2. java 序列化慢_java原生序列化慢在哪里?
  3. java jsp 文件上传_用JSP编写文件上传
  4. unity调用普通java类_Unity中C#和Java的相互调用实例代码
  5. Java 线程池详解
  6. 给力!神策数据创新推出数字化运营闭环解决方案!
  7. YII框架开发一个项目的通用目录结构:
  8. 3月19 HTML静态网页的制作
  9. java多线程(一)-Thread类和Runnable接口
  10. TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!
  11. Asp.net Core之TagHelper
  12. SpringBoot→整合数据层、@Valid参数校验、事务propagation属性、动态SQL、AOP监控执行时间
  13. Ubuntu16.04安装卸载MongoDB
  14. QCC蓝牙芯片PIO操作
  15. Matlab如何下载安装科研绘图工具Gramm并绘图
  16. 抓包中情局特工后,是时候聊聊勒索黑客了!
  17. eplan窗口宏与符号宏是什么_电气设计||Eplan P8 宏功能的应用
  18. python实现:无刻度的一大一小水罐取水问题
  19. 2019年1月1日之后 你能少缴纳多少个税
  20. 产品经理与工程师的换位思考

热门文章

  1. linux支持cpu类型,cpu类型
  2. linux wifi数据发送邮件,Linux中无法发送邮件
  3. English interview。。。
  4. 备受资本市场关注的Zebec,正在构建“新DeFi”生态
  5. html5中移动旋转缩放,HTML5 Canvas进阶(一):渐变,透明,移动,旋转,缩放
  6. 华电软工非全研究生学习工作总结-研二开学总结
  7. EndnoteX9下载及教程
  8. linux安装mysql centos_Linux CentOS安装Mysql
  9. 卸载win10自带的OneNote
  10. 考研数据结构判断题整合