1 HTTP缺点
HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点都可以知道传输的内容是什么。
因此HTTP具有如下的缺点:
-
窃听风险:被第三方通信内容。
-
篡改风险:第三方修改客户端和服务券的通信内容。
- 冒充风险:第三方可以仿冒客户端或者服务端发给对端的通信内容。
2 HTTPS
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据
2.1 客户端发起HTTPS请求
客户端与服务端之间建立TCP连接,使用的是443端口
2.2 handshake协议(握手协议)
client发送ClientHello,指定版本,随机数(RN),所有支持的密码套件(CipherSuites):
- TLS的版本
- 随机数:这个是用来生成最后加密密钥的影响因子之一,包含两部分:时间戳(4-Bytes)和随机数(28-Bytes)
- session-id:用来表明一次会话,第一次建立没有。如果以前建立过,可以直接带过去。
- 加密算法套装列表:客户端支持的加密-签名算法的列表,让服务器去选择。
- 压缩算法:似乎一般都不用
- 扩展字段:比如密码交换算法的参数、请求主机的名字等等
收到client hello后,服务器恢复ACK,没有使用捎带确认
server回应ServerHello,指定版本,RN(服务器生成的随机数,稍后用于生成"对话密钥"),选择CipherSuites,会话ID(Session ID)
通过这一步,客户端和服务器就完成了加密和签名算法的交换。
server发送Certificate
然后,服务器给客户端展示证书
ServerKey Exchange:用来发送密钥交换算法相关参数和数据的。根据密钥交换算法的不同,传递的参数也是不同的。
ServerHello Done:服务器要传输的信息结束
client拿到server的certificate后,就可以开始利用certificate里的public key进行session key的交换了。
ClientKey Exchange:客户端对Server Key Exchange的回应,用于交换密钥需要的参数。和服务器一样,不同的密钥交换算法实现是不一样的,因此需要的参数也是有差异的:包含pre-master secret。客户端生成第三个随机数。如果是采用RSA算法,会生成一个48字节随机数,然后用server的公钥加密之后再放入报文中;
change_cipher_spec 客户端使用上面的3个随机数client random, server random, pre-master secret, 计算出48字节的master secret, 这个就是对称加密算法的密钥。
Server-Client已经将服务器认证的相关工作做完了,密文函数&密钥交换需要的参数也都相互传递了。
- server hello 中选择了加密函数
- ServerKey Exchange:传递加密函数的一个参数
- ClientKey Exchange:传递了机幂函数的另一个参数。这个参数是使用服务器的公钥加密过的
Encrypted Handshake Message:表明握手已经完成,并且对之前发过的数据进行加密发送给对方做校验,防止被篡改。同时也验证一下,加密算法、密钥工作是否正常。
总结
SSL/TLS握手过程可以分成两种类型:
- 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书。
- 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户端身份进行验证
这个过程实际上产生三个随机数:client random, server random, pre-master secret.前两个随机数都是明文传送的,只有pre-master secret是加密的(RSA或者DH)。server使用RSA证书,RSA即可以用作签名也可以用作不对称加密,pre-master secret就是用server的RSA证书中包含的公钥加密的。
3 HTTP与RAS
RSA算法在:
- 证书签名的时候
- 密钥交换
RAS计算过程:
-
选两个超级大的素数:p 和 q
-
把他们乘起来:n = p * q
-
然后把p-1和q-1也乘起来:m = (p - 1) * (q - 1)
-
再找一个和m互质的数:e -> gcd(e, m) = 1
-
最后,找一个d,满足:(e * d) mod m = 1然后公钥就是(n, e)的组合,私钥就是(n, d)的组合
4 HTTPS与STL
TLS要做的事情就是两个:身份校验 & 加密算法和密钥协商。