https笔记(TLS流程详解与https转发方案).md
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
create by mxmkeep@
本文参考其他文章七拼八凑和自己总结而成
1. https与http区别
1.1 浏览器显示不同
1.2 数据传输不同
1.3 http风险
2. SSL与TLS
2.1 什么是Secure Sockets Layer
2.2 历史
2.3 详细解释
2.4 TLS的设计目标
3. 协议
3.1 五层协议
3.2 TLS具体协议
4 TLS流程
4.1 两个问题
4.2 基本握手过程
4.3 抓包
4.4 握手过程
4.4.1 客户端发出请求(ClientHello)
4.4.2 服务器回应(SeverHello)
4.4.3 客户端回应
4.4.4 服务器的最后回应
4.5 Alert 协议
4.6 application data协议
5. 转发方案
5.1 不解密转发
5.2 无密钥解密转发
6. 证书相关
7. 相关文档
1. https与http区别
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)
https://
1.1 浏览器显示不同
1.2 数据传输不同
(1) 窃听风险(eavesdropping ):第三方可以获知通信内容。
(2) 篡改风险(tampering ):第三方可以修改通信内容。
(3) 冒充风险(pretending ):第三方可以冒充他人身份参与通信。
SSL(Secure Sockets Layer 安全套接层),是为网络通信提供安全及数据完整性的一种安全协议,SSL 在传输层对网络连接进行加密。
1995: SSL 2.0, 由Netscape 提出,这个版本由于设计缺陷,并不安全,很快被发现有严重漏洞,已经废弃。
1996: SSL 3.0. 写成RFC ,开始流行。
目前(2015年)已经不安全,必须禁用。
1999: TLS 1.0. 互联网标准化组织ISOC 接替NetScape 公司,发布了SSL 的升级版TLS 1.0版. 2006: TLS 1.1. 作为 RFC 4346 发布。
主要fix 了CBC 模式相关的如BEAST 攻击等漏洞 2008: TLS 1.2. 作为RFC 5246 发布 。
增进安全性。
目前(2015年)应该主要部署的版本,请确保你使用的是这个版本
2015之后: TLS 1.3,还在制订中,支持0-rtt ,大幅增进安全性,砍掉了aead 之外的加密方式由于SSL 的2个版本都已经退出历史舞台了,所以本文后面只用TLS 这个名字。
读者应该明白,一般所说的SSL 就是TLS 。
安全证书既包含了用于加密数据的密钥,又包含了用于证实身份的数字签名。
安全证书采用公钥加密技术。
公钥加密是指使用一对非对称的密钥进行加密或解密。
每一对密钥由公钥和1.3 http 风险
2. SSL 与TLS
2.1 什么是Secure Sockets Layer
2.2 历史
2.3 详细解释
私钥组成。
公钥被广泛发布。
私钥是隐秘的,不公开。
用公钥加密的数据只能够被私钥解密。
反过来,使用私钥加密的数据只能被公钥解密。
这个非对称的特性使得公钥加密很有用。
在安全证书中包含着一对非对称的密钥。
只有安全证书的所有者才知道私钥。
当通信方A将自己的安全证书发送给通信方B时,实际上发给通信方B的是公开密钥,接着通信方B可以向通信方A发送用公钥加密的数据,只有通信方A才能使用私钥对数据进行解密,从而获得通信方B发送的原始数据。
安全证书中的数字签名部分是通信方A的电子身份证。
数字签名告诉通信方B该信息确实由通信方A发出,不是伪造的,也没有被篡改。
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。
私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。
非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
(1)对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
(2)非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
(3)解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通
2.4 TLS的设计目标
TLS的设计目标是构建一个安全传输层(Transport Layer Security ),在基于连接的传输层(如tcp)之上提供:
密码学安全
(1). 保密, message privacy (保密通过加密encryption实现,所有信息都加密传输,第三方无法窃听 )
(2). 完整性, message integrity(通过MAC校验机制,一旦被篡改,通信双方会立刻发现)
(3). 认证, mutual authentication (双方认证,双方都可以配备证书,防止身份被冒充)3. 协议
3.1 五层协议
http
https
3.2 TLS具体协议
1. 做对称加密传输的record协议,the record protocol
2. 做认证密钥协商的handshake协议,the handshake protocol
还有3个很简单的辅助协议:
1. changecipher spec 协议,the changecipher spec protocol, 用来通知对端从handshake
切换到record协议(有点冗余,在TLS1.3里面已经被删掉了)
2. alert协议,the alert protocol, 用来通知各种返回码,
3. application data协议, The application data protocol,就是把http,smtp等的数据流传
入record
层做处理并传输互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度。
而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL/TLS 协议变得异常复杂。
TLS 协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
(1)如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。
只要证书是可信的,公钥就是可信的。
(2)公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session ),客户端和服务器端都生成一个”对话密
钥”(session key ),用它来加密信息。
由于”对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密”对话密钥”本身,这样就减少了加密运算的消耗时间。
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成”对话密钥”。
(3) 双方采用”对话密钥”进行加密通信。
整个握手过程就是为了生成3个随机数来做对称加密密钥,而且此密钥不可以在网络中传送过
ClientHello.random
ServerHello.random
master_secret
4 TLS 流程
4.1 两个问题
4.2 基本握手过程
4.3 抓包
4.4 握手过程
“握手阶段”涉及四次通信,我们一个个来看。
需要注意的是,”握手阶段”的所有通信都是明文的。
4.4.1 客户端发出请求(ClientHello)
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。
在这一步,客户端主要向服务器提供以下信息。
(1)支持的协议版本,比如TLS 1.0版。
(2)一个客户端生成的随机数,稍后用于生成”对话密钥”。
(3)支持的加密方法,比如RSA公钥加密。
(4)支持的压缩方法。
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。
也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。
这就是为什么通常一台服务器只能有一张数字证书的原因。
对于虚拟主机的用户来说,这当然很不方便。
2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。
session id - 新链接在session 恢复的时候用到,无需重新握手
TLS的完整握手过程,要进行RSA/ECDH/ECDSA等非对称计算,非对称计算是很慢的。
有鉴于此,TLS从设计之初,就采用了万能手段—加cache,有2种cache手段:
session id,和session ticket。
把握手的结果直接cache起来,绕过握手运算。
在实践中,session cache在服务器端要求key-value形式的存储,如果tls服务器不止一台的话,就有一个存储怎么共享的问题,要么存储同步到所有TLS服务器的内存里,要么专门搞服务来支持存储,并使用rpc访问,无论如何,都是很麻烦的事情,相比之下,后文要介绍的session ticket就简单多了,所以一般优先使用session ticket。
SessionTicket 定义在 RFC5077 标准里面,2008年发布。
SessionTicket是一种不需要服务器端状态的,恢复TLS session的方式。
SessionTicket可以用于任何CipherSuite。
TLS 1.0, TLS 1.1, TLS 1.2 都适用
如果服务器希望使用 SessionTicket 机制,服务器把本地的 session 状态存入一个ticket 中,ticket会被加密,加密算法只有服务器知道
4.4.2 服务器回应(SeverHello)
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。
服务器的回应包含以下内容。
(1)确认使用的加密通信协议版本,比如TLS 1.0版本。
如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
(2)一个服务器生成的随机数,稍后用于生成”对话密钥”。
(3)确认使用的加密方法,比如RSA公钥加密。
(4)服务器证书。
( 5 ) 公钥
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供”客户端证书”。
比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
4.4.3 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。
如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。
然后,向服务器发送下面三项信息。
(1)一个随机数。
该随机数用服务器公钥加密,防止被窃听。
(2)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(3)客户端握手结束通知,表示客户端的握手阶段已经结束。
这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称”pre-master key”。
有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把”会话密钥”。
至于为什么一定要用三个随机数,来生成”会话密钥”,dog250解释得很好:
“不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。
由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。
”
此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。
4.4.4 服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的”会话密钥”。
然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。
这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。
接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用”会话密钥”加密内容。
4.5 Alert 协议
通知协议,警告或关闭链接之类
就是把应用数据直接输入record 层,做分段,算MAC ,加密,传输
要解决的问题:数据都加密了,如何知道是要转发给谁?
解决方案,解析出连接首个包clienthello 里边的server name 即可 4.6 application data 协议
5. 转发方案
5.1 不解密转发
关于SSL ,服务器有两样东西
证书 - 包含公钥
私钥 - 在整个握手过程中,私钥只需要用到一次
解决方案
可将证书放在防御代理,然后在握手过程中,需要解密premaster secret 时,发给真实服务器,让其解密,再按照代理与真实服务器协商好的加密方式,加密返回
CA 下发给网站的证书是分层的证书链,从根证书开始一层一层直到网站证书。
要验证某一层证书是否确实由上级CA 发放的需要验证附带在该证书上的由上级CA 通过签名函数及私钥生成的数字签名。
数字签名的解密需要上级CA 的公钥,这个公钥就明文保存在证书链中的上层证书中。
而根证书是自己给自己签名,也就是根证书的签名也是靠自己保存的公钥来解密。
这就解决了真实性问题,也就是能证明最底层的网站证书确实是证书中标明的CA 发放的。
而可信性是看根证书是否在操作系统或浏览器内置的根证书列表中,如果在的话那么这个证书链就可信的。
5.2 无密钥解密转发
6. 证书相关
7. 相关文档
https:///html/rfc2246
https:///html/rfc5246
/blog/2014/02/ssl_tls.html
/blog/2014/09/illustration-ssl.html
/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/ /30084209/viewspace-1388333/
/dog250/article/details/5717162。