SSL/TLS概述
参考文章: http://drops.xmd5.com/static/drops/tips-6002.html
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
https://www.jianshu.com/p/46e48bc517d0
https://blog.****.net/tterminator/article/details/50675540
一、SSL/TLS的简述
SSL全称是Secure Sockets Layer,安全套接字层,它是由网景公司(Netscape)设计的主要用于Web的安全传输协议,SSL的主要目标是:
- 认证性——借助数字证书认证服务器端和客户端身份,防止身份伪造
- 机密性——借助加密防止第三方窃听
- 完整性——借助消息认证码(MAC)保障数据完整性,防止消息篡改
SSL最初的几个版本(SSL 1.0、SSL2.0、SSL 3.0)由网景公司设计和维护,从3.1版本开始,SSL协议由因特网工程任务小组(IETF)正式接管,并更名为TLS(Transport Layer Security),发展至今已有TLS 1.0、TLS1.1、TLS1.2这几个版本。TLS1.0和TLS1.1都存在安全风险,一般只是为了兼容性才开启TLS1.0和TLS1.1。
二、TLS证书
一般TLS证书会包含三个文件:CA证书、公钥、私钥。
公钥和私钥是成对的,主要是利用非对称加密算法进行加解密,由于非对称加密算法的复杂度很高,我们一般不会直接利用公私钥对对数据进行加解密,而是利用公私钥对来协商对称加密的秘钥。
CA证书的作用是来确认对端数字证书的真实性。数字证书 = encrypt(公钥等信息,CA的私钥),如下图。所以当TLS交换数字证书的过程中,我们就可以使用本端的CA证书(即CA的公钥)进行解密,再hash公钥,比较hash值与证书中是否相等,来确认对端证书的真实性和有效性。
图1 签名过程
图2 认证过程
数字证书一般包括以下信息,这里以X.509证书为例,包括版本号(大多数在用的SSL证书都是V3版本,V1版本存在安全问题)、***、签名算法、发行方(指颁发证书的CA机构)、有效期、主体名称、主体公钥和算法、扩展和签名。
图3 X509证书格式
下面重点介绍下证书链的概念,我理解的是证书链的目的是为了确保root certificates的绝对安全性,所以增加中间层,来完全隔离端证书和根证书。
在Chrome上任意打开一个支持HTTPS的网站,例如 https://im.qq.com/ ,我们会发现在地址栏的左侧有个绿色的小锁,点击这个小锁,然后就可以查看这个网站的证书信息:
图4 证书链
证书有3类:
- end-user :wkd.qq.com证书,包含用来加密传输数据的公钥的证书,是HTTPS中使用的证书
- intermediates: GlobalSign Organization Validation CA - SHA256 - G2证书, CA用来认证公钥持有者身份的证书,即确认HTTPS使用的end-user证书是属于baidu.com的证书。这类intermediates证书甚至可以有很多级。
- root:GlobalSign Root CA证书,用来认证intermediates证书是合法证书的证书。
三、协议介绍
1、SSL/TLS协议架构
SSL/TLS协议位于传输层和应用层之间,其承载在TCP上。
图5 SSL/TLS协议架构
- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、**交换;
- ChangeCipherSpec 协议:一条消息表明握手协议已经完成;
- Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告;
- Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。
2、协议流程
一个典型的TLS 1.0协议交互流程如下图所示:
ClientHello:ClientHello通常是握手过程中的第一条消息,用于告知服务器客户端所支持的密码套件种类、最高SSL/TLS协议版本以及压缩算法。
ClientHello中还包含一个随机数,这个随机数由4个字节的当前GMT UNIX时间以及28个随机选择的字节组成,共32字节。该随机数会在**生成过程中被使用。
另外,ClientHello中还可能包含客户端支持的TLS扩展。(TLS扩展可以被用来丰富TLS协议的功能或者增强协议的安全性)
ServerkeyExchange消息会携带这些**交换算法所需要的额外参数,以在后续步骤中协商PreMasterSecret。这些参数需要被签过名。
CertificateRequest:这个消息通常在要求认证客户端身份时才会有。消息中包含了证书类型以及可接受的CA列表。本次TLS协商不涉及该消息。
ServerHelloDone:服务器发送这条消息表明服务器部分的**交换信息已经发送完了,等待客户端的消息以继续接下来的步骤。这条消息只用作提醒,不包含数据域。
ClientKeyExchange:这条消息包含的数据与所选用的**交换算法有关。
如果选择的**交换算法是RSA,那么消息包含的参数为用服务器RSA公钥(包含在之前证书中的或者是ServerKeyExchange中的)加密过的PreMasterSecret,它有48个字节,前2个字节表示客户端支持的最高协议版本,后46个字节是随机选择的。
如果选择的**交换算法是DH或者DHE,则可能有两种情况:
隐式DH公开值:包含在Certificate消息里;
显示DH公开值:公开值是本消息的一部分。(本次协商选择显示DH方式)
CertificateVerify:这条消息用来证明客户端拥有之前提交的客户端证书的私钥
ChangeCipherSpec:指示从现在开始发送的消息都是加密过的
Finished:表明握手阶段结束。这是第一条用协商的算法和**保护的消息。其包含了前面所有握手消息的hash,可以让接收方验证握手过程是否被第三方篡改