HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点均可以知道传输的内容是什么。算法
所以HTTP具备以下的缺点:服务器
窃听风险:被第三方通讯内容。session
篡改风险:第三方修改客户端和服务券的通讯内容。dom
HTTPS实际上是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会经过TLS进行加密,因此传输的数据都是加密后的数据函数
客户端与服务端之间创建TCP链接,使用的是443端口ui
client发送ClientHello,指定版本,随机数(RN),全部支持的密码套件(CipherSuites):加密
收到client hello后,服务器恢复ACK,没有使用捎带确认spa
server回应ServerHello,指定版本,RN(服务器生成的随机数,稍后用于生成"对话密钥"),选择CipherSuites,会话ID(Session ID)server
经过这一步,客户端和服务器就完成了加密和签名算法的交换。xml
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已经将服务器认证的相关工做作完了,密文函数&密钥交换须要的参数也都相互传递了。
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证书中包含的公钥加密的。
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)的组合
TLS要作的事情就是两个:身份校验 & 加密算法和密钥协商。