SSL/TLS算法流程解析
SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住。本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获。
一、相关版本
| Version | Source | Description | Browser Support |
| SSL v2.0 | Vendor Standard
(from Netscape Corp.) [SSL2] |
First SSL protocol for which implementations exist | - NS Navigator 1.x/2.x - MS IE 3.x - Lynx/2.8+OpenSSL |
| SSL v3.0 |
Expired Internet Draft (from Netscape Corp.) [SSL3] |
Revisions to prevent specific security attacks, add non-RSA ciphers and support for certificate chains | - NS Navigator 2.x/3.x/4.x - MS IE 3.x/4.x - Lynx/2.8+OpenSSL |
| TLS v1.0 |
Proposed Internet Standard (from IETF) [TLS1] |
Revision of SSL 3.0 to update the MAC layer to HMAC, add block padding for block ciphers, message order standardization and more alert messages. | -Lynx/2.8+OpenSSL |
SSL全称为 Socket Security Layer,TLS全称为Transport Layer Security,这两者没有本质的区别,都是做的传输层之上的加密(介于传输层及应用层之间)。TLS是后续SSL版本分支的名称,花费长时间去争论两者的优劣没有意义。目前TLS最新版本为 TLS1.2(也称为SSL3.3)
二、SSL/TLS 解决的问题
信息被窃听(wiretap),第三方随时随地获得通讯内容;
SSL/TLS 实现了传输信息的加密。
数据被篡改(tampering),第三方可修改传输中的数据;
SSL/TLS 实现了数据签名及校验。
身份被冒充(pretending),第三方可冒充通讯者身份传输数据;
SSL/TLS 采用了CA数字证书认证机制。
三、握手阶段
简单点说,SSL/TLS对于传输层的加密是通过动态密钥对数据进行加密实现的,而动态密钥则通过握手流程协商制定;为了保证动态密钥的安全性,其中免不了使用公钥加密算法(非对称)、数字证书签名等技术手段。
一个SSL/TLS 握手过程需要协商的信息包括:
1 协议的版本号;
2 加密算法,包括非对称加密算法、动态密钥算法;
3 数字证书,传输双方通过交换证书及签名校验对彼此进行鉴权;
4 动态密钥,传输数据过程使用该密钥进行对称加解密,该密钥通过非对称密钥进行加密传输。
四、流程解析
一个典型的SSL/TLS 握手流程包括双向认证,如下所示:

1. 客户端发出一个 client hello 消息,携带的信息包括:
所支持的SSL/TLS 版本列表;支持的与加密算法;所支持的数据压缩方法;随机数A;
2. 服务端响应一个 server hello 消息,携带的信息包括:
协商采用的SSL/TLS 版本号;会话ID;随机数B;服务端数字证书 serverCA;
由于双向认证需求,服务端需要对客户端进行认证,会同时发送一个 client certificate request,表示请求客户端的证书;
3. 客户端校验服务端的数字证书;校验通过之后发送随机数C,该随机数称为pre-master-key,使用数字证书中的公钥加密后发出;
由于服务端发起了 client certificate request,客户端使用私钥加密一个随机数 clientRandom随客户端的证书 clientCA一并发出;
4. 服务端校验客户端的证书,并成功将客户端加密的随机数clientRandom 解密;
根据 随机数A/随机数B/随机数C(pre-master-key) 产生动态密钥 master-key,加密一个finish 消息发至客户端;
5. 客户端根据 同样的随机数和算法 生成master-key,加密一个finish 消息发送至服务端;
6. 服务端和客户端分别解密成功,至此握手完成,之后的数据包均采用master-key进行加密传输。
五、要点解析
双向认证和单向认证
双向认证更好的解决了身份冒充问题,服务端提供证书的同时要求对客户端身份进行认证;然而在一些常见的应用场景下往往只有单向认证,如采用https网站只需要求客户端(浏览器)对服务端的证书进行认证。
在单向认证场景下,握手阶段2服务端不会发出 client certificate request,之后服务端也不需要校验客户端证书;
在双向认证场景下,客户端如果无法提供证书,会发出 no digital certificate alert 的警告信息,此时可能导致握手失败(根据服务端策略而定);
随机数的使用
由于数字证书是静态的,因此要求使用随机因素来保证协商密钥的随机性;对于RSA 算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
之所以采用 pre-master-key 机制是因为SSL协议不信任每个主机都能产生完全随机的随机数,如果 pre-master-key 不随机,那么被猜出来的风险就很大,于是仅仅使用 pre-master-secret作为密钥不合适,需要引入新的随机因素,也就是同时结合hello消息中的双向随机数。
会话密钥重用
SSL/TLS握手过程比较繁琐,同时非对称加解密性能比对称密钥要差得多;如果每次重建连接时都需要进行一次握手会产生较大开销,因此有必要实现会话的重用以提高性能。
常用的方式包括:
SessionID(RFC 5246),客户端和服务端同时维护一个会话ID和会话数据状态;重建连接时双方根据sessionID找到之前的会话密钥实现重用;
SessionTicket(RFC 5077),由服务端根据会话状态生成一个加密的ticket,并将key也发给客户端保证两端都可以对其进行解密。该机制相较sessionID的方式更加轻量级,服务端不需要存储会话状态数据,可减轻一定压力。
证书的校验
1. 检查数字签名;
数字签名通过数字摘要算法生成并通过私钥加密传输,对端公钥解密;
2. CA链授权检查;
3. 证书过期及激活时间检查;
数字摘要的计算图示

关于Server Name Indication
在普通 SSL/TLS握手的过程中,客户端发送的信息之中不包括服务器的域名;因此理论上服务器只能包含一个域名,否则会分不清应该向客户端提供哪一个域名的数字证书。在后续TLS的版本中实现了SNI(Server Name Indication) 扩展,用于支持一台服务器主机需服务多个域名的场景。
由客户端请求时发送指定的域名,服务器据此选择相应证书完成握手。
六、参考文档
An overview of the SSL or TLS handshake
SSL/TLS算法流程解析的更多相关文章
- Python多继承解析顺序的C3线性算法流程解析
Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和 ...
- SSL/TLS协议工作流程
我看了CloudFlare的说明(这里和这里),突然意识到这是绝好的例子,可以用来说明SSL/TLS协议的运行机制.它配有插图,很容易看懂. 下面,我就用这些图片作为例子,配合我半年前写的<SS ...
- (转)SSL/TLS 漏洞“受戒礼”,RC4算法关闭
原文:https://blog.csdn.net/Nedved_L/article/details/81110603 SSL/TLS 漏洞“受戒礼” 一.漏洞分析事件起因2015年3月26日,国外数据 ...
- SSL/TLS 漏洞“受戒礼”,RC4算法关闭
SSL/TLS 漏洞"受戒礼" 一.漏洞分析 事件起因 2015年3月26日,国外数据安全公司Imperva的研究员Itsik Mantin在BLACK HAT ASIA 2015 ...
- HTTPS 和 SSL/TLS 协议:密钥交换(密钥协商)算法及其原理
转自:https://blog.csdn.net/andylau00j/article/details/54583769 本系列的前一篇,咱们聊了“密钥交换的难点”以及“证书体系”的必要性.今天这篇来 ...
- SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法
本文转载自SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法 导语 作为一名安全爱好者,我一向很喜欢SSL(目前是TLS)的运作原理.理解这个复杂协议的基本原理花了我好几天的时间,但只要 ...
- Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)
摘要: Java Security在Java存在已久了而且它是一个非常重要且独立的版块,包含了很多的知识点,常见的有MD5,DigitalSignature等,而Android在Java Se ...
- SSL/TLS握手过程
----------------------------------专栏导航----------------------------------HTTPS协议详解(一):HTTPS基础知识 HTTPS ...
- [No0000126]SSL/TLS原理详解与WCF中的WS-Security
SSL/TLS作为一种互联网安全加密技术 1. SSL/TLS概览 1.1 整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下: SSL:(Secure Socket La ...
随机推荐
- jQuery是什么?
jQuery就是javascript的一个库,把我们常用的一些功能进行了封装,方便我们来调用,提高我们的开发效率. 极大地简化了 JavaScript 编程. Javascipt跟jQuery的区别: ...
- C++中explicit关键字的使用
看书看到了explicit关键字,就来做个笔记,讲得比较明白,比较浅. 在C++中,我们有时可以将构造函数用作自动类型转换函数.但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++ ...
- python调用NLPIR - ICTCLAS2013实现中文分词
环境:win7.VS2008.Python2.7.3 第一步:照着文档[2]将NLPIR库封装成Python的扩展: 第二步:新建一个名为“nlpir_demo”的目录,将第一步最后得到的名为“nlp ...
- UE4 UriEncode 问题
当Uri 路径中带中文字符时,需要进行编码 否则会照成不可预见错误: FString temp = FGenericPlatformHttp::UrlEncode(queryStr); FString ...
- DOS命令大全!
一)MD——建立子目录 1.功能:创建新的子目录 2.类型:内部命令 3.格式:MD[盘符:][路径名]〈子目录名〉 4.使用说明: (1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前 ...
- SharePoint 2013配置 Workflow Manager
折腾了好几天,用Windows Server 2012 R2安装 SharePoint Server 2013都没装上去.最后发现必须安装带SP1的SharePoint 2013,不然那一步IIS永远 ...
- 29 个你必须知道的 Linux 命令
虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的.Bash和 Linux Shell ...
- 问题:C++ 删除数组指针实用 delete []变量 汇编怎么实现的?
问题:C++ 删除数组指针实用 delete []变量 汇编怎么实现的?
- 服务器使用recast navigation
在3D MMO或者其他类型的游戏中,通常需要进行寻路处理,地图针对寻路有多种方案,比如划分格子,凸多边形等,本篇介绍一种比较常用的navigation mesh的方式来进行寻路.不过整套navmesh ...
- 《深入浅出Node.js》第5章 内存控制(未完)
@by Ruth92(转载请注明出处) 第5章 内存控制 基于无阻塞.事件驱动建立的 Node 服务,具有内存消耗低的优点,非常适合处理海量的网络请求. 内存控制正是在海量请求和长时间运行的前提下进行 ...