美文网首页
SSL协议学习

SSL协议学习

作者: 黄二的NPE | 来源:发表于2018-09-01 14:06 被阅读34次
  • HTTP和HTTPS的包的区别

假如我们用HTTP协议访问http://qf.56.com/activity/galaxy2018/topic.do,我们用wireshark抓到的请求包(客户端发送过去的请求url的包)如下:

HTTP

那如果是用HTTPS协议呢?经过我不懈的观察,应该是对应以下的包:


HTTPS

二者进行比较,HTTPS的包少了Hypertext Transfer Protocol(HTTP),但是多了Secure Socket Layer(SSL),SSL多了一些不明物体-Encrypted Application Data(加密应用数据),那这些加密应用数据是什么呢?这些加密应用数据其实就是上面加密后的Hypertext Transfer Protocol的数据。

  • SSL/TLS协议是什么

SSL(secure socket layout),位于应用层与传输层之间,我们姑且可以把它理解为OSI中的表示层。它的作用就是对传输层中的数据进行加密,使他变成上面的那个样子。

为什么好好的服务器返回给客户端的数据包要加密呢?原来在互联网中,我们的数据包会经过一系列的复杂的网络,假如在数据包经过的某个点中被坏人放了监控,用HTTP协议的话纯粹是在裸奔,我们做什么别人都一清二楚。更有甚者,有些人替换了传给我们的内容,让我们本不该看到的东西,比如那些恶心的电信广告。而加了密的内容首先别人看不到,并且很难进行操作。这些个SSL包达到应用程序以后,应用程序会对他进行解密,使他成为我们熟悉的Hypertext Transfer Protocol数据。

  • SSL的作用

  1. 杜绝窃听风险,所有信息都是加密传播,第三方无法窃听。
  2. 让篡改毫无作为,因为具有校验机制,一旦被篡改,通信双方会立刻发现。
  3. 不可能让你冒充的,配备身份证书,防止身份被冒充。
  • 问题

我们知道,这其实就是个加密和解密的游戏。客户端对数据进行加密,然后发给服务端,服务端对数据进行解密,然后再对需要返回的数据加密再返回给客户端,客户端再解密。说的好像很容易,但是这里存在着一个问题,就是要通信之前要双方先协商好加密规则。比如我用的是对称性加密,你却说你要用非对称性加密算法,这样子不管我怎么加密,你用你那一套都是没有办法解开的。另外就算是用的同一个算法,比如我们都是用的DES对称性加密算法,然而我们的秘钥(加密因子)都不一样,也是没有办法正常交流的。所以要让通信双方愉快的加密交流,首先要定义好加密规则,即用什么加密算法,然后还要准备好秘钥。

  • 加密算法

对称性算法

对称密钥加密(英语:Symmetric-key algorithm)又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。实务上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通讯联系。与公开密钥加密相比,要求双方取得相同的密钥是对称密钥加密的主要缺点之一。常见的对称加密算法有:DES、3DES、AES、Blowfish、IDEA、RC5、RC6。

非对称性算法

公开密钥加密(英语:public-key cryptography,又译为公开密钥加密),也称为非对称加密(asymmetric cryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥(其实这里密钥说法不好,就是“钥”),一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。常见的非对称性加密算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。

散列算法

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。常见的散列算法有:MD5,SHA。

SSL中的加密算法
SSL加密算法

这里客户端和服务器协商后使用的加密算法集,其中:

CipherSuite算法类型 示例中对应算法 常见算法名称 备注
密钥交换算法 ECDHE DHE,ECDHE 对对称加密中的秘钥进行加密和解密的算法
认证算法 RSA RSA(主流),DSA,ECDSA 对数字签名进行非对称性解密的算法
加密算法 CHACHA20_POLY1305 AES128/256 bit,加密模式gcm/ cbc/ ecbRC4和3DES,DES 此后客户端和服务端传输数据用的对称性加密算法
MAC算法 SHA384 SHA256, SHA384, SHA1 把数字证书哈希加密的散列算法,加密后的数字证书和经过认证算法解密的签名进行比较,如果一致,说明没有被修改

重点: 非对称性算法只是用来传送对称算法中的密码因子,最后客户端与服务端的通信还是通过对称算法来的。不使用非对称性算法的原因是非对称性算法实在是太慢了。MAC算法是用来加密证书的。

  • SSL基本过程

  1. TCP建立连接
  2. 客户端与服务端进行握手,协商加密规则。
  3. 双方采用"对话密钥"进行加密通信。
  4. TCP释放连接
握手
握手四个阶段
握手过程抓包
  1. 客户端发出请求(ClientHello),提供以下数据:
    A. 支持的协议版本,比如TLS 1.0版。
    B. 一个客户端生成的随机数,稍后用于生成"对话密钥"。
    C. 支持的加密方法,比如RSA公钥加密。
    D. 支持的压缩方法。


  1. 服务器回应(ServerHello),提供以下数据:
    A. 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
    B. 一个服务器生成的随机数,稍后用于生成"对话密钥"。


C. 确认使用的加密方法,比如RSA公钥加密。
D. 服务器证书。

签名
我们要怎么验证数据是否有被修改过呢?朋友你是否记得不可逆算法,比如MD5等散列算法,用散列算法加密过后的数据是不可逆的;这段加密后的数据就是签名,我们把源数据和签名一起发给对方,对方收到源数据和签名以后,用协商好的算法加密源数据,如果得出的签名和发过来的签名一致,就说明源数据在发送过程中没有被修改过。

证书
假设客户端请求服务端,一开始就被黑客劫持了,客户端握手阶段也是跟这个黑客握手,黑客可以返回错误的响应内容给客户端。那有什么办法保证跟客户端交流的是真正的服务端,而不是黑客呢。这就牵扯到证书的概念了。首先先明确的是证书就是能够证明你是你的东西。

证书路径

证书路径

一般网站的证书都分为三级,首先是root证书,它是操作系统内置的,它包含了CA证书机构的公钥,用来解密intermediates CA证书的签名,来核实intermediates CA证书是否有效;其次是intermediates CA证书,它是CA证书机构颁给站点的证书,里面包含了站点发给CA机构的公钥,可以用来解密end-user证书的签名,来核实end-user证书是否有效;最后才是end-user证书,end-user证书是本次客户端和服务器交互的证书,里面包含了本次交互的公钥,客户端可以利用该公钥来加密pre master key。intermediates CA证书和end-user证书是服务端发给客户端的。

证书的运作

服务端把server hello发过来的时候,会携带一张intermediates CA和一张end-user证书,还传送了intermediates CA的签名和end-user证书的签名;客户端收到以后,用系统内置证书的公钥解密一下intermediates CA证书的签名,然后用散列算法加密一下intermediates CA证书,看看和解密后的签名是否一致,如果一致,说明这个intermediates CA证书确实是有效的,确实是CA机构颁发给站点的;然后再用intermediates CA证书里面的公钥来解密end-user书的签名,验证证书是否是否有被修改,验证过期时间啥的,如果都没有问题,就可以使用站点证书里面的公钥来加密一个客户端随机生成的数字,作为以后交换数据对称性加密的加密引子。

  1. 客户端回应
    客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
    如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。
    A. 一个随机数。该随机数用服务器公钥加密,防止被窃听。
    B. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    C. 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。

  1. 服务端最后的回应
    服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。
    A. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    B. 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

相关文章

网友评论

      本文标题:SSL协议学习

      本文链接:https://www.haomeiwen.com/subject/vjdxwftx.html