TLS握手:回顾1.2、迎接1.3

novsec2019-05-10共26541人围观 ,发现 2 个不明物体网络安全

*本文原创作者:novsec,本文属于FreeBuf原创奖励计划,未经许可禁止转载

https://www.freebuf.com/articles/network/202504.html

挺好的资料~
先简单说明一下历史.
 NetScape SSL 1.0 未发布

 NetScape SSL 2.0

 SSL 3.0

 ISOC TLS 1.0(SSL 3.1)

 TLS 1.1 (SSL 3.2)

 TLS 1.2 (SSL 3.3)

 TLS 1.3

我记得.net 4.0 仅支持 TLS 1.1 不支持 1.2

最新的dotnet .3了..

apple的app貌似要求最低 1.2.

前言

HTTPS或者说SSL or TLS现在都是老生常谈的东西了,为什么还要写这篇文章?

TLS 1.3 2018年发布了,在看1.3的变动前有必要盘点下1.2的主要原理。另外,在我查找握手细节的过程中发现很多博客没有把一些细节解释清楚,主要是关于RSA和DH两种密钥协商协议所产生的一些细节上的区别,所以就有了这篇文章。

背景

SSL/TLS的解决的威胁:

1.数据泄露问题(Data Leak):信息加密,明文传输->密文传输;

2.数据篡改(Data tampering):保证数据完整性, MAC, AE(after TLS 1.2);

3.身份认证问题(spoofing/pretending): 身份鉴别,数字证书。

HTTPS是什么?可简单的理解为HTTP over SSL。

SSL在设计上拥有可扩展性,不仅可以和HTTP结合作HTTPS,还可应用到很多其他的应用成协议,如FTP,Telnet等等。

历史

1994 NetScape SSL 1.0 未发布

1995 NetScape SSL 2.0

1996 SSL 3.0

1999 ISOC TLS 1.0(SSL 3.1)

2006 TLS 1.1 (SSL 3.2)

2008 TLS 1.2 (SSL 3.3)

2018 TLS 1.3

基础知识

非对称加密与对称加密

简单的理解,非对称加密加解密使用不同的密钥,对称加解密使用相同的密钥。

非对称加密性能不如对称加密。

非对称加密私钥要保持隐秘性,公钥是公开的。私钥加密,公钥解密,叫签名,可用来验证身份,公钥加密,私钥解密,就是常见的加密传输信息。

证书和签名

简单的说,CA将申请者的公钥和信息进行单向hash,生成摘要,然后CA用自己的私钥对摘要进行签名,最好将申请信息(公钥)和签名整合生成证书。

Client(电脑和浏览器)内置了CA的根证书,根证书中包含CA公钥,用CA公钥解密证书,验证证书,拿到摘要,然后按照同样的HASH算法生成摘要,将两个摘要进行比对。

比较详细的通俗解释参考:一篇文章读懂HTTPS及其背后的加密原理

密钥交换(密钥协商)及身份认证

SSL设计的最重要关键点就是密钥交换。

单纯用对称加密,如果双方不预先内置(PSK),直接明文传输,机密性无法保证;加密传输,产生先有鸡还是先有蛋的问题。

非对称加密,主要有两种方式:基于RSA的密钥协商和基于DH的密钥协商。

基于RSA的密钥协商,引入了CA证书,可以解决数据泄露问题,CA证书解决身份认证问题。

基于DH的密钥协商通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥, 可以解决数据泄露问题,但是不能解决身份认证问题,会存在MITM攻击。所以DH密钥协商需要配合某种签名算法,如果没有配合任何签名算法,称为“DH-ANON”。此外,DH有很多种,DH本身依赖的是求离散对数问题困难性,而变种ECDH依赖求解椭圆曲线离散对数问题困难性。

SSL/TLS handshake

Overview

      Client                                               Server

      ClientHello                  -------->
                                                      ServerHello
                                                     Certificate*
                                               ServerKeyExchange*
                                              CertificateRequest*
                                   <--------      ServerHelloDone
      Certificate*
      ClientKeyExchange
      CertificateVerify*
      [ChangeCipherSpec]
      Finished                     -------->
                                               [ChangeCipherSpec]
                                   <--------             Finished
      Application Data             <------->     Application Data

Client Hello

包含:

client支持的协议版本

client random value

支持的加密套件列表

……, 例如:压缩方法

Server Hello

包含:

确认使用的协议版本

server random value

选择的加密套件

加密套件命名

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS 协议

ECDHE 密钥交换协议

ECDSA 身份认证算法

AES_128_GCM 对称加密算法

SHA256 MAC

Server Certificate(可选)

服务器证书,这一步紧随在Server Hello 之后,用来供客户端验证服务器的身份。

Server Key Exchange Message(可选)

This message will be sent immediately after the server Certificate message (or the ServerHello message, if this is an anonymous negotiation).

这个步骤在Server Certificate后,按照RFC的说法,如果没有Server Certificate,则在Server Hello之后。

该环节也是可选的。如果秘钥协商算法选用的是诸如RSA这类,则不会发送这部分信息。RFC中的原文是

The ServerKeyExchange message is sent by the server only when the server Certificate message (if sent) does not contain enough data to allow the client to exchange a premaster secret.

可简单的理解,如果是采用的非对称加密算法来进行秘钥协商,可以通过公钥加密发送预主秘钥的算法不需要发送这部分信息。如RSA,而像DH及其变种这种密钥交换算法则需要通过这个环节发送算法所需的参数信息。RFC中给出的DH参数结构参考:

      struct {
          opaque dh_p<1..2^16-1>;
          opaque dh_g<1..2^16-1>;
          opaque dh_Ys<1..2^16-1>;
      } ServerDHParams;     /* Ephemeral DH parameters */

      dh_p
         The prime modulus used for the Diffie-Hellman operation.

      dh_g
         The generator used for the Diffie-Hellman operation.

      dh_Ys

Certificate Request(可选)

SS分为单向SSL(One-way SSL)和双向SSL(Two-way SSL),两者区别主要是server端是否需要对client端进行身份验证,常见场景如银行提供的USB证书。双向SSL,这部分信息会在Server Key Exchange Message之后,单向SSL中,不会发送这部分信息。

Server Hello Done

最后,server发送这部分信息来结束Sever hello, 等待客户端回应。

Client Certificate(可选)

这部分信息是Server Hello Done 之后可以发送的第一部分信息,对应Certificate Request,也是可选部分。

Client Key Exchange Message

这部分信息在Client Certificate之后发送,在单向SSL中,在Server Hello Done后发送。这部分信息包含的最重要的一部分信息是premaster secret(预主密钥),permaster的说法对应的是RSA,而在DH中对应的是DH exponent。

如果密钥协商算法是RSA, client会生成一个48字节长的预主密钥,然后用server的公钥加密后发送。

如果是DH算法,则发送client端生成的DH public value(dh_Yc)(请参考DH的数学原理), 此外如果之前的client certificate已经加密发送了这个值,那这里也会发送一个空值过去。

Certificate Verify(可选)

这部分信息如果需要发送,会跟随在Client Key Exchange Message部分后。

Finished

在最后,发送完ChangeCipherSpec,验证了密钥交换协议和身份认证成功后,会发送finish信息。至此握手完成。

Master Secret

无论用哪种密钥协商算法,最后的主密钥计算方法是相同的——TLS采用了一个PRF来做主密钥的计算,PRF的参数就是之前的两个随机数加上预主密钥。

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

Q & A

1.RSA的时候直接设置秘钥不行么,为什么需要引入random;

2.SSL不信任每个client都能产生安全的随机数,所以client和server各引入了一个random value;

3.三个random怎么生成最终的秘钥;

这个问题,很多帖子都没有说明,最开始看的时候这是我的一个疑惑,其实RFC中给出了很明确的回答,参考握手中的部分。

4.为什么不直接用非对称加密通信?

性能问题。因为非对称加密的性能不如对称加密,所以TLS的核心任务就是怎么产生一个双方共同的、秘密的、可信密钥。

TLS 1.3

TLS 1.3 废除了RSA 密钥协商机制,保证PFS,PFS主要是为了避免回溯性破解,回溯性破解简单的说就是如果在将来拿到了双防的私钥,能推导出会话密钥,就能解密通信内容。而RSA的私钥是稳定长期不变的,所以无法保证PFS,而DH可以强制每次生成随机私钥,之后强制销毁,可以保证PFS,这种DH变种叫做DHE。

TLS1.3废除了HMAC(SHA1, MD5),只采用AEAD验证完整性,AEAD是AE的变种,可以在解密的同时验证完整性

TLS1.3中,对称加密算法只保留了AES。压缩特性废除。

TLS1.3由于废除了RSA的密钥协商机制,所以握手协议的过程变动较大,比如DH算法的参数1.2前的版本由server生成,整个握手过程2-RTT,而1.3中,DH参数直接在第一步由client生成,整个握手过程1-RTT。

详细的TLS1.3握手过程参考RFC 8446,有空再写。

[转帖]TLS握手:回顾1.2、迎接1.3的更多相关文章

  1. TLS握手优化详解

      随着 HTTP/2 的逐渐普及,以及国内网络环境越来越糟糕(运营商劫持和篡改),HTTPS 已经开始成为主流.HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Laye ...

  2. SSL/TLS 握手过程详解

    在现代社会,互联网已经渗透到人们日常生活的方方面面,娱乐.经济.社会关系等都离不开互联网的帮助.在这个背景下,互联网安全就显得十分重要,没有提供足够的安全保障,人们是不会如此依赖它的.幸运的是,在大牛 ...

  3. SSL/TLS握手过程

    ----------------------------------专栏导航----------------------------------HTTPS协议详解(一):HTTPS基础知识 HTTPS ...

  4. [转帖]TLS 1.3 VS TLS 1.2,让你明白 TLS 1.3 的强大

    TLS 1.3 VS TLS 1.2,让你明白 TLS 1.3 的强大 https://www.jianshu.com/p/efe44d4a7501?utm_source=oschina-app 又拍 ...

  5. SSL/TLS 握手优化详解

    随着 HTTP/2 的逐渐普及,以及国内网络环境越来越糟糕(运营商劫持和篡改),HTTPS 已经开始成为主流.HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Layer ...

  6. [转帖]TLS 1.3概述

    TLS 1.3概述 http://www.inforsec.org/wp/?p=1960   By Yanting Yang | 四月 26, 2017| SecComm 作者:李新宇 中科院软件所 ...

  7. 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

    SSL/TLS握手过程可以分成两种类型: 1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书.2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户 ...

  8. TLS握手协议

    SSL/TLS基础 SSL(Secure Sockets Layer 安全套接层),及其继任者-传输层安全(Transport Layer Security, TLS)是为网络通信提供安全及数据完整性 ...

  9. TLS握手

    http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1 ...

随机推荐

  1. Python分布式+云计算

    参考: http://wiki.python.org/moin/ParallelProcessing http://wiki.python.org/moin/DistributedProgrammin ...

  2. CodeForces-687A(DFS,染色)

    链接: https://vjudge.net/problem/CodeForces-687A 题意: Recently, Pari and Arya did some research about N ...

  3. Python---CSS选择器权重以及补充

    一. 嵌入式CSS CSS引入方式优先级 二.

  4. Maven:mirror和repository

    1 Repository(仓库) 1.1 Maven仓库主要有2种: remote repository:相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问 local repository ...

  5. maven项目使用自己创建的jar包--maven without test code

    eclipse版本为2018-12(4.10.0) 1.创建一个jar包 首先自己建立了一个maven project,名为jweb.GAV坐标: <groupId>amberai< ...

  6. 消息队列之--RocketMQ

    序言 资料 https://github.com/alibaba/RocketMQ http://rocketmq.apache.org/

  7. LCA模板 ( 最近公共祖先 )

    LCA 有几种经典的求取方法.这里只给出模板,至于原理我完全不懂. 1.RMQ转LCA.复杂度O(n+nlog2n+m) 大致就是 DFS求出欧拉序 => 对欧拉序做ST表 => LCA( ...

  8. Algorithm lesson final exam

    1.algorithm analysis O B/W/AV/AMOR,混入其他问题,设计+分析 2.传统算法(肯定要考) 1)divide and conquer master therem. rec ...

  9. js控制手机保持亮屏的库,解决h5移动端,自动息屏问题

    一些说明:我用Laya(ts)开发小游戏,有需要保持手机屏幕常亮的需求(非必须的),然后作为小白的我就在网上找到了这个库,大概了解下,应该是通过播放空视频的原理来保持手机屏幕常亮,然后就放到项目中试了 ...

  10. 记一次CTF实验吧的代码审计

    0X01 0X01 Burp抓包找到hint 访问地址看源码 <?php $info = ""; $req = []; $flag="xxxxxxxxxx" ...