createbymxmkeep@qq.com本文参考其他文章七拼八凑和自己总结而成1.https与http区别1.1浏览器显示不同1.2数据传输不同1.3http风险2.SSL与TLS2.1什么是SecureSocketsLayer2.2历史2.3详细解释2.4TLS的设计目标3.协议3.1五层协议3.2TLS具体协议4TLS流程4.1两个问题4.2基本握手过程4.3抓包4.4握手过程4.4.1客户端发出请求(ClientHello)4.4.2服务器回应(SeverHello)4.4.3客户端回应4.4.4服务器的昀后回应4.5Alert协议4.6applicationdata协议5.转发方案5.1不解密转发5.2无密钥解密转发6.证书相关7.相关文档HTTPS(全称:HyperTextTransferProtocoloverSecureSocketLayer)1.https与http区别浏览器显示不同1.2数据传输不同(1)窃听风险(eavesdropping):第三方可以获知通信内容。(2)篡改风险(tampering):第三方可以修改通信内容。(3)冒充风险(pretending):第三方可以冒充他人身份参与通信。SSL(SecureSocketsLayer安全套接层),是为网络通信提供安全及数据完整性的一种安全协议,SSL在传输层对网络连接进行加密。1995:SSL2.0,由Netscape提出,这个版本由于设计缺陷,并不安全,很快被发现有严重漏洞,已经废弃。1996:SSL3.0.写成RFC,开始流行。目前(2015年)已经不安全,必须禁用。1999:TLS1.0.互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS1.0版.2006:TLS1.1.作为RFC4346发布。主要fix了CBC模式相关的如BEAST攻击等漏洞2008:TLS1.2.作为RFC5246发布。增进安全性。目前(2015年)应该主要部署的版本,请确保你使用的是这个版本2015之后:TLS1.3,还在制订中,支持0-rtt,大幅增进安全性,砍掉了aead之外的加密方式由于SSL的2个版本都已经退出历史舞台了,所以本文后面只用TLS这个名字。读者应该明白,一般所说的SSL就是TLS。安全证书既包含了用于加密数据的密钥,又包含了用于证实身份的数字签名。安全证书采用公钥加密技术。公钥加密是指使用一对非对称的密钥进行加密或解密。每一对密钥由公钥和1.3http风险2.SSL与TLS2.1什么是SecureSocketsLayer2.2历史2.3详细解释私钥组成。公钥被广泛发布。私钥是隐秘的,不公开。用公钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能被公钥解密。这个非对称的特性使得公钥加密很有用。在安全证书中包含着一对非对称的密钥。只有安全证书的所有者才知道私钥。当通信方A将自己的安全证书发送给通信方B时,实际上发给通信方B的是公开密钥,接着通信方B可以向通信方A发送用公钥加密的数据,只有通信方A才能使用私钥对数据进行解密,从而获得通信方B发送的原始数据。安全证书中的数字签名部分是通信方A的电子身份证。数字签名告诉通信方B该信息确实由通信方A发出,不是伪造的,也没有被篡改。对称加密是昀快速、昀简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secretkey)非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(publickey)和私钥(privatekey)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。(1)对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。(2)非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。(3)解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通TLS的设计目标是构建一个安全传输层(TransportLayerSecurity),在基于连接的传输层(如tcp)之上提供:密码学安全(1).保密,messageprivacy(保密通过加密encryption实现,所有信息都加密传输,第三方无法窃听)(2).完整性,messageintegrity(通过MAC校验机制,一旦被篡改,通信双方会立刻发现)(3).认证,mutualauthentication(双方认证,双方都可以配备证书,防止身份被冒充)http2.4TLS的设计目标3.协议3.1五层协议https1.做对称加密传输的record协议,therecordprotocol2.做认证密钥协商的handshake协议,thehandshakeprotocol还有3个很简单的辅助协议:1.changecipherspec协议,thechangecipherspecprotocol,用来通知对端从handshake切换到record协议(有点冗余,在TLS1.3里面已经被删掉了)2.alert协议,thealertprotocol,用来通知各种返回码,3.applicationdata协议,Theapplicationdataprotocol,就是把http,smtp等的数据流传3.2TLS具体协议入record层做处理并传输互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度。而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL/TLS协议变得异常复杂。TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。(1)如何保证公钥不被篡改?解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。(2)公钥加密计算量太大,如何减少耗用的时间?解决方法:每一次对话(session),客户端和服务器端都生成一个”对话密钥”(sessionkey),用它来加密信息。由于”对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密”对话密钥”本身,这样就减少了加密运算的消耗时间。(1)客户端向服务器端索要并验证公钥。(2)双方协商生成”对话密钥”。(3)双方采用”对话密钥”进行加密通信。整个握手过程就是为了生成3个随机数来做对称加密密钥,而且此密钥不可以在网络中传送过ClientHello.randomServerHello.randommaster_secret4TLS流程4.1两个问题4.2基本握手过程4.3抓包4.4握手过程“握手阶段”涉及四次通信,我们一个个来看。需要注意的是,”握手阶段”的所有通信都是明文的。4.4.1客户端发出请求(ClientHello)首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。在这一步,客户端主要向服务器提供以下信息。(1)支持的协议版本,比如TLS1.0版。(2)一个客户端生成的随机数,稍后用于生成”对话密钥”。(3)支持的加密方法,比如RSA公钥加密。(4)支持的压缩方法。这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个ServerNameIndication扩展,允许客户端向服务器提供它所请求的域名。sessionid-新链接在session恢复的时候用到,无需重新握手TLS的完整握手过程,要进行RSA/ECDH/ECDSA等非对称计算,非对称计算是很慢的。有鉴于此,TLS从设计之初,就采用了万能手段—加cache,有2种cache手段:sessionid,和sessionticket。把握手的结果直接cache起来,绕过握手运算。在实践中,sessioncache在服务器端要求key-value形式的存储,如果tls服务器不止一台的话,就有一个存储怎么共享的问题,要么存储同步到所有TLS服务器的内存里,要么专门搞服务来支持存储,并使用rpc访问,无论如何,都是很麻烦的事情,相比之下,后文要介绍的sessionticket就简单多了,所以一般优先使用sessionticket。SessionTicket定义在RFC5077标准里面,2008年发布。SessionTicket是一种不需要服务器端状态的,恢复TLSsession的方式。SessionTicket可以用于任何CipherSuite。TLS1.0,TLS1.1,TLS1.2都适用如果服务器希望使用SessionTicket机制,服务器把本地的session状态存入一个ticket中,ticket会被加密,加密算法只有服务器知道服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。(1)确认使用的加密通信协议版本,比如TLS1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。(2)一个服务器生成的随机数,稍后用于生成”对话密钥”。(3)确认使用的加密方法,比如RSA公钥加密。(4)服务器证书。(5)公钥除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供”客户端证书”。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。4.4.2服务器回应(SeverHello)客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。(1)一个随机数。该随机数用服务器公钥加密,防止被窃听。(2)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。(3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称”pre-masterkey”。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把”会话密钥”。至于为什么一定要用三个随机数,来生成”会话密钥”,dog250解释得很好:“不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器昀终导出一个对称密钥。premaster的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么premastersecret就有可能被猜出来,那么仅适用premastersecret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上premastersecret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。”此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。服务器收到客户端的第三个随机数pre-masterkey之后,计算生成本次会话所用的”会话密钥”。然后,向客户端昀后发送下面信息。(1)编码改变通知,表示随后的信息都将用双方商定