目录

前言

TLS/SSL 基础概念

密钥协商过程中存在的问题及解决办法

TLS/SSL 握手过程


前言

本文是对 HTTPS 安全基础、TLS/SSL 工作原理及握手过程的总结。第一部分介绍为 HTTPS 提供安全基础的 TLS/SSL 的基础概念,及数据传输过程中密钥协商的原因。第二部分介绍密钥协商过程中存在的问题,及解决办法,其中会涉及 PKI、CA 等概念。最后介绍 TLS/SSL 的握手过程。

HTTP 和 HTTPS 的区别:https://blog.csdn.net/qq_38289815/article/details/80969419

TLS/SSL 基础概念

概念源自百度百科:传输层安全性协议 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在 1994 年推出首版网页浏览器,网景导航者时,推出 HTTPS 协议,以 SSL 进行加密,这是 SSL 的起源。IETF 将 SSL 进行标准化,1999 年公布第一版 TLS 标准文件。随后又公布RFC 5246(2008年8月)与RFC 6176(2011年3月)。在浏览器、邮箱、即时通信、VoIP、网络传真等应用程序中,广泛支持这个协议。主要的网站,如 Google、Facebook 等也以这个协议来创建安全连线,发送数据。目前已成为互联网上保密通信的工业标准。

TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

散列函数 Hash

常见的有 MD5、SHA1、SHA256,该类函数特点是函数单向不可逆、对输入非常敏感、输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完整性。在信息传输过程中,散列函数不能单独实现信息防篡改,因为明文传输,中间人可以修改信息之后重新计算信息摘要,因此需要对传输的信息以及信息摘要进行加密。

对称加密

常见的有 AES-CBC、DES、3DES、AES-GCM 等,信息的加密和解密用相同的密钥,掌握密钥才能获取信息。在对称加密中,信息安全的基础是保证密钥的安全。

非对称加密

即常见的 RSA 算法,还包括 ECC、DH 等算法,算法特点是,密钥成对出现,一般称为公钥(公开)和私钥(保密)。因此掌握公钥的不同客户端之间不能互相解密信息,只能和掌握私钥的服务器进行加密通信。服务器持有私钥可以实现一对多的通信,而客户端可以用公钥来验证服务器发送的数字签名。服务器只需要维持一个私钥就能够和多个客户端进行加密通信,但该算法的计算复杂,加密速度慢。

结合三类算法的特点,TLS/SSL 的基本工作方式是,客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥,然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取。

密钥协商过程中存在的问题及解决办法

存在的问题

上面介绍了 TLS/SSL 在 HTTPS 信息传递中扮演的角色,我们知道了要用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥。可是这个公钥是怎么传递给客户端的?

上面图中的过程是不安全的,接下来对该问题进行说明。与公钥密码加密系统相伴的一个重要挑战就是正确地决定某个主体或身份的公钥。如果 AB 发送自已的公钥,M 能够在传输过程中将其修改为自己的公钥。B (也被称为依赖方)可能察觉不到自已使用的是 M 的公钥,而认为这是 A 的公钥。这样就使得 M 能够轻易地扮演 A 的角色,即如下图所示:

解决办法

一种常见的方法是依靠中心化的机构,其中包括对公钥基础设施 PKI (Public Key Infrastructure) 的使用。这一方法在特定的理论假设下容易被证明是安全的。 PKI 负责提供创建、吊销、分发以及更新密钥对与证书的服务。它需要一些证书颁发机构 CA  (Certificate Authority) 才能运行。证书颁发机构是用于管理与认证一些个体与它们的公钥间的绑定关系的实体。目前有数百家商业证书颁发机构。一个证书颁发机构通常采用层次的签名构架。这意味着一个公钥可能会被一个父密钥签名,而这个父密钥可能会被一个祖父密钥签名,依次类推。最终,一个证书颁发机构会拥有一个或多个根证书,许多下属的证书都会依赖根证书来建立信任。

在实践中,系统往往要求公钥操作应当拥有知名 CA 的根证书。这些根证书是在配置时安装的 (例如,微软公司的 Intemet ExpIorer 浏览器、 Mozilia 公司的 Firefox 浏览器以及 Google 公司的 Chrome 浏览器都能够访问一个预先配置的根证书数据库)。

TLS/SSL 握手过程

1. client_hello

客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:

(1) 支持的最高TSL协议版本version,从低到高依次 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3。

(2) 客户端支持的加密套件 cipher suites 列表, 每个加密套件对应前面 TLS 原理中的四个功能的组合:认证算法 Au (身份验证)、密钥交换算法 Key Exchange(密钥协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验)。

(3) 支持的压缩算法 compression methods 列表,用于后续的信息压缩传输。

(4) 随机数 random_C,用于后续的密钥的生成。

(5) 扩展字段 extensions,支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段作用。

2. server_hello + server_certificate + sever_hello_done

(1) server_hello, 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S 等,其中随机数用于后续的密钥协商。

(2) server_certificates,服务器端配置对应的证书链,用于身份验证与密钥交换。

(3) server_hello_done,通知客户端 server_hello 信息发送结束。

3. 证书校验

客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:

(1) 证书链的可信性 trusted certificate path。

(2) 证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同。

(3) 有效期 expiry date,证书是否在有效时间范围。

(4) 域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析。

4. client_key_exchange + change_cipher_spec + encrypted_handshake_message

(1) client_key_exchange,合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器。

(2) 此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商密钥: enc_key = Function(random_C, random_S, Pre-Master); 。

(3) change_cipher_spec,客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。

(4) encrypted_handshake_message,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商密钥 session secret 与算法进行加密,然后发送给服务器用于数据与握手验证。

5. change_cipher_spec + encrypted_handshake_message

(1) 服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥:enc_key = Function(random_C, random_S, Pre-Master); 。

(2) 计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和密钥正确性。

(3) change_cipher_spec, 验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信。

(4) encrypted_handshake_message, 服务器也结合所有当前的通信参数信息生成一段数据并采用协商密钥 session secret 与算法加密并发送到客户端。(将随机密码加密的数据响应给客户端)

6. 握手结束

客户端计算所有接收信息的 hash 值,并采用协商密钥解密 encrypted_handshake_message,验证服务器发送的数据和密钥,验证通过则握手完成。

7. 加密通信

开始使用协商密钥与算法进行加密通信。注意:

(1) 服务器也可以要求验证客户端,即双向认证,可以在过程 2 要发送 client_certificate_request 信息,客户端在过程 4 中先发送  client_certificate 与 certificate_verify_message 信息,证书的验证方式基本相同,certificate_verify_message 是采用 client 的私钥加密的一段基于已经协商的通信信息得到数据,服务器可以采用对应的公钥解密并验证。

(2) 根据使用的密钥交换算法的不同,如 ECC 等,协商细节略有不同,总体相似。

(3) sever key exchange 的作用是 server certificate 没有携带足够的信息时,发送给客户端以计算 pre-master,如基于 DH 的证书,公钥不被证书中包含,需要单独发送。

(4) change cipher spec 实际可用于通知对端改版当前使用的加密通信方式,当前没有深入解析。

(5) alter message 用于指明在握手或通信过程中的状态改变或错误信息,一般告警信息触发条件是连接关闭,收到不合法的信息,信息解密失败,用户取消操作等,收到告警信息之后,通信会被断开或者由接收方决定是否断开连接。

签名过程

发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用发送方的私钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方。接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用公钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该报文是发送方的。

数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。 一次数字签名涉及到一个哈希函数、接收者的公钥、发送方的私钥。

参考:百度百科、《TCP/IP详解卷1:协议》

https://blog.csdn.net/freekiteyu/article/details/76423436

https://blog.csdn.net/hherima/article/details/52469674

TLS/SSL 工作原理及握手过程详解相关推荐

  1. 光纤收发器的原理及应用_光纤收发器的工作原理以及使用方法详解!

    原标题:光纤收发器的工作原理以及使用方法详解! 关于光纤收发器的工作原理以及使用方法这块,在这里飞畅科技的小编做了专门的整理,首先,我们来了解下什么是光纤收发器,光纤收发器是一种将短距离的双绞线电信号 ...

  2. Nginx 反向代理工作原理简介与配置详解

    Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...

  3. SQL注入攻击实现原理与攻击过程详解

    SQL注入攻击实现原理与攻击过程详解 结构化查询语言(SQL)是一种用来和数据库交互的文本语言,SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到 ...

  4. 通俗易懂的TCP,SSL以及HTTPS的连接建立过程详解

    可以参考B站的一个视频,把TLS/SSL的连接建立过程降解的非常透彻.配合这篇博客食用更佳.一遍不懂请多看几遍,很有用! 1 说明 1.1 对称加密的和非对称加密 在数字加密算法中,通过可划分为对称加 ...

  5. HTTPS篇之SSL握手过程详解

    由于最近接触到的一个项目数据有些敏感,所以需要通过加密算法保证数据的安全性.由于公司之前有一套自定义传输协议并且有配套的公共代码导致客户端人员不太愿意使用 WWS 协议.且之前的协议没有协议层的数据加 ...

  6. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  7. Android中AMS工作原理,Android AMS启动详解

    启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...

  8. Ping(网络诊断工具)的工作原理及命令参数详解和使用

    一: 1.ping的基本信息 PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序.Ping发送一个ICMP(Internet Control Mess ...

  9. java struct工作原理_Struts2的工作原理(图解)详解

    Struts2的工作原理 上图来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码:https://github.com ...

最新文章

  1. 新来了个技术总监:谁再用 @Async 创建线程以后就不用来了!!
  2. IT行业观察:阿里巴巴有望成为下一只中国IPO
  3. unity 程序win7在进程里运行_Win7系统中unity web player是什么程序
  4. ssm把图片保存到项目中_项目中的图片跨域问题解决方式
  5. 快速安装第三方库的指令——解决第三方库安装超时问题
  6. 如何独立实现一个基于知识图谱的问答系统
  7. .netcore持续集成测试篇之MVC层单元测试
  8. Python3 函数注释: 参数 中 的 冒号 与 箭头
  9. java string常用的占位符形式
  10. 你知道关闭页面时怎么向后台发送消息吗?
  11. 源代码仓库选择-gitlab
  12. linux等待队列wait_queue_head_t和wait_queue_t
  13. 不会写Java面试简历?看这一篇就够了(项目经历,个人技能)
  14. vue3.0教程——搭建Vue脚手架【简化版】
  15. 量化投资 --- 技术篇 (1) CAPM模型
  16. vmd参数优化 matlab,遗传算法优化VMD参数
  17. Opencv下双线性插值法进行图像放缩
  18. Git从远程仓库克隆
  19. java比较炫的登录界面_教你写一个炫酷的Material Design 风格的登录和注册页面
  20. JavaScript的富文本编辑

热门文章

  1. c++ reference counting引用计数原理
  2. __try,__except,__finally,__leave异常模型机
  3. 将应用打包为 Snaps
  4. 第26讲:模拟登录爬取实战案例
  5. 深入理解RCU|核心原理
  6. 从容器到容器云,什么才是 Kubernetes 的本质?
  7. QUIC DataChannels的第一步
  8. Java多线程之多线程之间按顺序调用
  9. ​“免疫杀手” Deep X-RAY
  10. google mock分享