@Author:清秋橘 Autumn_Tangerine
@Date:2021/7/19
@Last Modified:2021/7.19
序言
前不久在访问Github的时候,涉及到了SSL方面的相关知识,突然发现自己对SSL这个东西并不是很了解,所以打算先初步了解一下SSL/TLS
写篇博客记录一下,只有有深入学习的话也会在这里更新
理解SSL/TLS
如果你学过HTTP协议的话,你就知道,HTTP在传输数据的时候使用的是明文传输,并不会对数据进行加密,那么,此时如果利用抓包程序对HTTP报文进行抓包的话,就可以很轻易的获取有关传输信息的内容,甚至可以对其进行篡改,这样是很不安全的
为了解决这一隐患网景公司推出了SSL安全套接字协议层(Secure Socket Layer),SSL是基于HTTP之下TCP之上的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密操作
而TLS是更为安全的升级版 SSL,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security) ,可以说TLS就是SSL的新版本3.1
SSL现如今有1,2,3三个版本,但现在只使用版本3
TLS有1.0 1.1 1.2三个版本,默认使用1.0
HTTPS
HTTPS其实就是HTTP+SSL/TLS,由于HTTPS相比HTTP来说多了SLL/TLS进行进行数据加密,所以HTTPS比起HTTP来说是更安全的服务,但是HTTPS由于需要进行繁琐的加密解密过程,所以HTTPS的性能与HTTP有着极大的差距,甚至有些情况下,HTTPS的性能与运行效率只有HTTP的十分之一
所以,当你访问网址时,如果你通过HTTPS来访问网站的话,也就是在域名前添加https://,浏览器就会告诉你这个访问是安全的,换句话说,就是这次传输服务是经过SSL/TLS加密的,数据不会泄露

而如果你使用HTTP来访问网站的话,浏览器就会告诉你这次访问是不安全的,没有通过SSL加密,数据可能会泄露

当然,并不如随便任何一个网站都可以通过HTTPS来访问,这就涉及到另一部分也就是SSL证书的内容了
SSL证书
在通信双方进行通信的时候,不管是基础的对称加密还是非对称加密,都存在一个问题,就是,一旦获取到了密钥(特别是非对称加密的公钥是公开的),任何人都可以使用该密钥加密数据,接受的一方并没有办法能够判断出来发送数据的一方是不是自己想要接受到其数据的一方,所以这时候,对加密算法进行了升级,加入了
数字签名
先用hash函数生成包裹的摘要,然后我用私钥对这个摘要加密生成数字签名,这个时候这个数字签名可以被所有人用公钥解密看到,但是大家都没有办法对他进行修改,因为能加密他的只有私钥,最后对信件的内容进行hash,如果得到的结果和数字签名解密后的结果一样,说明包裹没有被人修改过(其实个人感觉过程有点类似于加密的CRC校验)
但是这里还有一个问题:因为数字签名起作用的前提是数据接收方知道发送方公布的公钥,也就是需要发送方提前把公钥发送过来,但是万一这个过程被伪造,也就是发送过来的公钥是假的呢
这个时候就有了一个认证中心,在认证中心CA,发送方的公钥进行了登记,认证中心用他的私钥加密发送方的公钥和一些其他信息交给发送方,这个时候就有了
数字证书(SSL证书)
相当于身份证,之后再发消息的时候在发送数字签名的同时也发送一份证书,通过对比就知道这个公钥有没有被伪造了。认证中心发的加密过的文件就叫做数字证书,证书必须是工信机构颁发的,必须人工进行登记,所以很难伪造。这也是https信息安全的原因,但是https证书需要注册认证,所以不需要保证网站数据安全的时候一般都使用http

CA会把一些基本信息例如持有者、用途、有效信息等打包,然后运用Hash算法得到一个Hash值
CA会使用自己的私钥将这个Hash值加密,生成一个Certificate Signature(证书签名),CA对证书进行了签名
最后将签名加到证书文件,形成数字证书
客户端使用同样的Hash算法,得到该证书的Hash值H1
浏览器使用CA的公钥,解密Certificate Signature中的内容,得到Hash值H2
如果H1等于H2,则证明可信
对称加密与非对称加密
如果想要更深入的了解SSL的话,就需要了解其加密机理,在此之前,需要先连接一下什么是对称加密,什么是非对称加密
对称加密
通信双方使用同一个密钥,使用加密算法配合上密钥来加密,解密时使用加密过程的完全逆过程配合密钥来进行解密
数据:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密钥:BCDEFGHIJKLMNOPQRSTUVWXYZA
算法:这里的算法就是每个字符采用后一位的字符替换,密钥就是原始的英文字母表
原始书信:I love you
加密书信:J mpwf zpv
解读后:I love you
对于这种加密方式,因为通信双方使用的是同一个密钥,在通信之前,如果需要通信双方沟通所使用的的密钥,该密钥就有可能需要在传输线路上进行传输,而如果有人抓取此时传输的内容的话,就可以拿到双方通信时使用的密钥,然后就可以根据相关算法破解出传输的内容,或者还有一种更暴力的方法,就是因为对称加密方式加密过程比较简单,可以通过截获到多个原文-密文对,然后使用穷举法计算出密钥与算法
常见的对称加密算法有DES(弃用)AES(现在最流行)
非对称加密
使用公钥对数据进行加密得到密文;使用私钥对数据进行解密得到原数据,加密解密用的算法相同。不能使用同一密钥加密和解密数据,私钥必须保持私有
使用私钥加密的数据只能被公钥解密,使用公钥加密的数据就只能被私钥解密
因为通信双方使用的密钥不同,所以被称为非对称加密
比如
原数据:110
公钥:+4
私钥:+6
公钥加密数据:554
私钥解密数据:111110
算法:111110 → 去掉每个的第一位,得出原数据110
私钥加密数据:776
公钥解密数据:111110
算法:111110 → 去掉每个的第一位,得出原数据110
放到C/S模型中,其实就是服务端拥有多对公钥-私钥,然后服务端把公钥公布出去,之后客户端想要与服务端通信时,就使用公钥对数据进行加密,加密以后只有服务端拥有私钥并且可以使用私钥解密出这段数据,之后服务端想要给客户端回信的时候也可以使用私钥加密数据,然后客户端使用公钥就可以解密出数据,当然如果客户端有其自己的公钥-私钥的话,也可以使用客户端的公钥进行加密,这一步就需要双方事前沟通好彼此的公钥了
这里再举例RSA算法便于更加深入的了解非对称加密算法
RSA 算法基于这样的数学事实:两个大质数相乘得到的大数难以被因式分解。 如:有很大质数 p 跟 q,很容易算出 N,使得 N = p * q,但给出 N, 比较难找 p 、q(没有很好的方式, 只有不停的尝试)
在 RSA 中,明文、密钥和密文都是数字。加密过程可以用下面的公式来表示:
密文 = 明文^E mod N
解密过程可以用下面的公式来表示:
明文 = 密文^D mod N
这里E与N的组合就可以理解为公钥,而D与N的组合就可以理解为私钥

TLS作用原理/过程
第一次握手
客户端向服务器发送请求,发送SSL/TLS版本,发送客户端支持的密码套件列表,然后会产生一个随机数(Client Random),发送给服务器,这是生成对称密钥的材料
第一次握手客户端做的事:
- 确定SSL/TLS版本
- 客户端生成的随机数,用于生成会话密钥(Client Random)
- 客户端支持的密码套件列表,如RSA算法
第二次握手
服务器响应客户端的请求,发送SSL/TLS版本,发送服务器选择的密码套件,发送随机数,发送数字证书
第二次握手服务器做的事:
- 确定SSL/TLS版本,如果不支持,直接关闭
- 服务器生成的随机数,后面用于生成会话密钥(Server Random)
- 确定服务器支持的密码套件列表,如RSA加密算法
- 发送数字证书
客户端拿到服务器的响应后,会去验证证书的证实有效性
第三次握手
证书有效,客户端生成一个随机数,用服务器的RSA公钥加密,然后发给服务器服务器收到后,用私钥解密收到
到此阶段,客户端和服务器共享了三个数,Client Random、Server Random、pre-master,双方根据这三个数生成密钥
生成密钥后客户端再发一个Change Cipher Spec告诉服务器开始使用加密通话
最后在发送一个Encrypted HandShare Message消息,向服务器发送握手摘要,再加密一下,让服务器验证
第三次握手客户端做的事:
- 发送一个随机数(密钥),该随机数会被公钥加密(pre-master)
- 加密算法改变的通知,表示之后的会话都将用会话密钥进行加密(Change Cipher Key Exchange)
- 客户端响应结束通知,握手数据的摘要(Encrypted HandShare Message)
第四次握手
服务器也是相同操作
服务器进行响应
- 加密算法改变通知,表示之后的信息会用加密的密钥进行加密(Change Ciper Spec)
- 服务器响应结束通知,握手数据的摘要(Encrypted HandShare Message)

总结
TLS的信息加密是混合加密,双方通通信开始前要协商版本,算法,密钥,随机数等,密钥协商时采用的是非对称加密,然后利用双方都知道的随机数和密钥生成会话时使用的密钥作为下面进行通信时使用的对称加密的密钥
参考资料
本博客在编写时参考到了以下网络或书籍上的资源,感谢
哔哩哔哩 《HTTPS是什么?加密原理和证书。SSL/TLS握手过程》
CSDN 《HTTPS、SSL、TLS三者之间的联系和区别》
简书 《浅谈http、https与数据加密》
CSDN 《一文读懂对称加密与非对称加密》
CSDN 《金融安全算法介绍系列3——非对称算法》
程序猿 《密码学知识》
CSDN 《TLS四次握手过程》
本博客由清秋橘(Autumn-Tangerine)编写,内容部分来源于网络,允许在出于分享及学习的目的下进行转载,当然如果可以的话,我还是希望您能够在转载时标明出处及原作者吗,不胜感激