https即 HTTP Secure,HTTP的通讯接口部分用SSL和TLS协议代替,并不是是一种新的协议。html
TLS协议是在SSL3.0的基础上开发的协议,如下统一用TLS协议来讲明前端
明文不行,考虑先加密再传输呢?好比我传输过程当中使用一种加密算法,在浏览器端本身加密和解密,服务端也提供对应的策略来加密和解密。前端代码基本属于彻底暴露在全部人的面前,这种本身实现加密和解密的机制都会被别人知晓(秘钥都会被看到),毫无安全性可言,另外若是每一个人都要这么搞一套,那就是重复造轮子,时间成本巨大,并且还不必定能作到很安全。linux
固然还包括性能、兼容性等等问题。git
秘钥确定不能硬编码写到代码中,一种解决方式是在每次通讯的过程当中先生成秘钥,而后的信息再用这个秘钥进行加密通讯,可是初次传输过程当中,仍然会出现明文传输秘钥的问题,一旦被窃听,后续全部的加密都都白费算法
密码学中的非对称加密能够解决这种场景,非对称加密拥有两个秘钥:公钥和私钥。公钥能够解开私钥加密的内容,私钥能够解开公钥加密的内容,那么只要私钥不泄密,经过公钥加密的内容就算被截取,现有的技术手段,是很难经过截取的内容和公钥获得原有的内容浏览器
若是获取的公钥是窃听人的公钥,而不是真正服务提供方的公钥,那么后续的通讯加密都是使用的窃听人的公钥,窃听人也天然使用本身的私钥能够进行解密。所以获取的公钥必须是可以信任的。
解决方式是把公钥放到数字证书中,这个证书由受信任的第三方机构进行颁发,并经过三方的私钥进行加密。客户端发起请求首先会向服务端请求三方的证书,客户端经过三方的公钥进行解密后,就安全拿到了服务端的公钥。安全
第三方的公钥自己则是由浏览器和操做系统本身去维护bash
窃听人也能够本身去申请个证书,放上本身的公钥,这样客户端一样也能够经过三方的公钥解密,可是解密出来的倒是窃听人的公钥。 解决方式是使用数字签名,证书上涵盖如何根据证书来生成数字签名的方法,与经过第三方机构的公钥解析到数字签名想比较,验证数字签名是否同样,同样则代表证书确是要访问的服务的。服务器
好比证书上会写所表明的网站,校验的时候加上访问的网站,就能够获得对应的信息session
https是创建在TLS协议之上的,它的通讯过程也是以TLS为基础。首先进行"握手",经过以后再进行通讯
客户端发送 ClientHello 信息,包含
服务端收到 ClientHello 以后,返回一个 ServerHello 信息,包含:
服务端发送证书
若是客户端也须要验证,会再发送一个要证书的请求给客户端
服务端发送 Server Hello Done 给客户端,表示Server Hello结束
若是客户端收到了证书请求,会先发送客户端证书
客户端对服务器的证书进行校验,没经过则发送警告给使用者,确认是否继续,经过则返回 Pre master secret(这也是客户端产生的一个随机数),这个 Pre master secret 自己会使用证书中的公钥进行加密
客户端发送 Change Cipher Spec 报文,表示后续通讯都会采用双方商定的加密方法和秘钥发送。
客户端会根据以前传递的随机数(2个)以及 Pre master secret 这三个随机数生成一个master_ key,而后从master_key中提取会话用的秘钥,用它加密一段内容,涵盖在这里客户端发送Finished报文中,表示客户端握手阶段结束同时也用来校验加密通道
服务器发送 Change Cipher Spec ,表示服务端也切换到位
服务端拿到公钥加密后的 Pre master secret 后,经过私钥解密,使用与客户端相同的方法,以及步骤7中的3个随机数,生成会话用的秘钥,使用这个加密秘钥发送一个Finished报文给客户端,验证加密通道,同时服务端握手结束
客户端和服务端都能对Finished信息正常解密且消息被验证,说明通道创建,后续经过上面产生的会话秘钥对数据进行加密传输
握手过程当中,有一个随机数是使用非对称秘钥加密后传输的,传输成功以后,两者生成的最后一个会话秘钥用来通话,这是由于非对称秘钥加密和解密处理速度相对对称秘钥要慢,所以仅在握手阶段使用非对称秘钥传递,通讯的时候使用握手阶段生成的会话秘钥进行加密
在握手的阶段首先是客户端随机生成了一个随机数,这是明文传输的,接着服务端返回了一个随机数,也是明文传输的,最后客户端使用了一个pre_master_key经过非对称加密的方式加密传输的,为何用到了3个随机数再通过计算获得一个master_key,而后才提取会话key?
首先说一下 pre_master_key,在握手的过程当中,会先约定好到底使用按个 Cipher Suit,好比约定使用RSA或者是(EC)DH suites 【(elliptic curve) Diffie-Hellman】,RSA会发送一个随机的48字节的 pre_master_key给服务端,可是 (EC)DH却不是,它产生的可能比48字节要长,也有可能要短,并且分布并不均衡。虽然经过RSA或者是(EC)DH是保证了pre_master_key自己的保密性,可是根据状况的不一样,产生的秘钥格长度(格式)不一致,而多数状况下,保持同样长度的秘钥会有很好的结果,好比同样的长度容许将秘钥交换端与加密端区分开来(打个比方,不能根据长度猜到究竟是用的那个非对称算法),某种程度上来讲也就具有更好的随机性。于是最好处理下pre_master_key保证最终输出的key的一致性
另外从安全性考虑,pre_master_key一旦使用后须要删掉
而对于产生pre_master_key的算法对于rsa来讲每次是随机的,可是对于dh,包括ecdh算法(不考虑匿名dh和瞬时dh),就只有hello消息中的两个随机数因子了。可是ssl协议自己并不信任每一个主机都能产生彻底随机的数字,若是随机数不随机,被猜出来就不合适了,所以选用3个随机数来达到更好的随机效果
随机带来的好处一个是当前的通讯不容易被才出来,另外每次都会不同,就是说就算当前的被才出来了,历史上的也没法解出正确的密文(也叫前向保护)。
最终经过PRF算法计算出一个固定长度为48字节的master_key,从中再提取出对应的会话key,提取规则以下:
client_write_MAC_key[SecurityParameters.mac_key_length]
server_write_MAC_key[SecurityParameters.mac_key_length]
client_write_key[SecurityParameters.enc_key_length] //会话key
server_write_key[SecurityParameters.enc_key_length] //会话key
client_write_IV[SecurityParameters.fixed_iv_length]
server_write_IV[SecurityParameters.fixed_iv_length]
复制代码
record protocol负责数据的发送,它会把数据分割成可处理的几块(每块2的14方字节或者更少),而后进行压缩,添加MAC(用于校验数据的完整性),加密,而后扔给底层的协议去处理;接收方则是进行数据的解密,校验,解压缩和从新聚合,再发送给上层的协议
rfc1.2中关于record protocol部分
rfc1.2中关于master_key计算与会话key提取
Diffie-Hellman运做
3个随机数的意义-来自csdn dog250
pre_master_key讨论
master_key,session_key,pre_master_key的解释
数字签名简介
也许这样理解https更容易
讨论http加密数据和使用https详情戳这里
SSL/TLS原理详解
HTTPS被信任 图解HTTP