概要
- tcp三次握手建立连接
- 客户端发送client-random+所支持的对称和非对称加密套件列表
- 服务端保存client-random,从中选择一个加密套件,返回service-random和数字证书
- 客户端收到service-random和数字证书,开始验证数字证书的合法性以及服务器的合法性;保存公钥,并生成pre-master随机数用公钥加密发送给服务器
- 服务器获得客户端pre-master用私钥解密;并用client-random,service-random和pre-master合成最终对称加密的秘钥master-secret
- 开始通信
数字证书的验证:
- 客户端用CA提供的HASH算法反算数字证书得到信息摘要A
- 客户端用CA的公钥解密数字证书得到信息摘要B
- 如果A/B一致则证书有效
注意:CA证书链会一直查找直根证书(操作系统内置)
一、为什么需要加密
HTTP采用明文传输数据,在传输过程的每一个环节都有可能被窃取或修改,这种攻击方式叫中间人攻击
为了解决该问题,在HTTP协议栈中引入安全层(SSL/TLS)
二、使用对称加密
对称加密:加密、解密都使用相同的秘钥。
加密流程如下:
- 浏览器发送它支持的加密套件(加密方法)列表和一个随机数client-random
- 服务端会从加密套件列表中选择一个加密套件,然后返回随机数service-random
- 最好服务端和浏览器分别返回确认消息
存在问题:加密套件和随机数都是用明文传输,很容易被劫持伪造秘钥
三、使用非对称加密
非对称加密:有A/B两把秘钥,数据要A加密要用B才能解密,反之B加密数据要用A秘钥进行解密。
在HTTPS中通过明文传输的叫公钥,服务器自己留下的不公开的叫私钥。
加密流程如下:
- 浏览器将加密套件列表发送至服务器
- 然后服务器选加一个密套件,将公钥通过明文发送给浏览器
- 双方确认返回的消息
存在的问题:非对称加密效率太低,无法保证服务器发送给浏览器的数据安全(因为,公钥容易获得,可以通过公钥解密服务器的数据,然后返回给客户端)
四、使用组合加密
在传输过程通过对称加密;但是获取对称加密的过程,非对称加密实现。
加密流程如下:
- 浏览器向服务器发送对称加密的套件列表、非对称加密套件列表和随机数client-random
- 服务保存随机数client-random,选择对称加密和非对称加密套件,然后生成随机数service-random,并向浏览器发送选择的加密套件、service-random、公钥
- 浏览器保存公钥、并生成随机数pre-master,然后利用公钥对pre-master加密,并向服务器发送加密后的数据
- 最好服务器用私钥解密pre-master数据,并返回确认消息。
此时服务器、浏览器有了共同client-random、service-random、 pre-master,然后将这三组随机数生成对称秘钥
注意:第三方劫持到pre-master也无法解密,因为只有服务器才有私钥。
五、添加数字证书
通过对称和非对称混合加密方式,可以完美实现数据的加密传输。
但是,无法避免劫持DNS修改IP地址,然后通过伪造的IP建立中间站点窃取公钥和私钥。
所以服务器还要想浏览器证明“我就是我”。
通过权威机构颁发的证书(如:公安局派出所颁发身份证)
这个权威机构成为CA(Certificate Authority),颁发的证书叫做数字证书(Digital Certificate)
对于浏览器来说,数字证书两个作用:证明服务器的身份,携带服务器公钥。
至此,请求流程改变如下:
- 服务器返回数字证书,公钥包含在数字证书中
- 浏览器对了个证书验证的过程,验证证书之后,才继续后续流程。
数字证书:申请
- 服务端准备公钥和私钥,私钥自己使用
- 服务端向CA提交公钥/公司/站点等信息并等待确认
- CA通过线上/线下确认真实性与合法性等
- 通过审核,颁发数字证书(服务端公钥、组织信息、CA信息、有效时间、证书序号等,同时包含一个CA生成的签名)
数字证书流程
- CA使用HASH函数计算提交明文的信息,并得出信息摘要
- CA使用它的私钥对信息摘要进行加密(加密后的密文就是CA颁发的数字签名)
数字证书:验证
- 浏览器获得数字证书后,用CA的hash算法得到信息摘要A
- 在通过CA的公钥解密数字证书得到信息摘要B
- 比较A/B,如果一致则确认证书合法
数字证书链
分两种:中间CA和根CA
根CA内嵌至操作系统,由WebTrust认证
中间CA通常办理服务端的申请业务浏览器会沿着证书链一直查找至根证书是否在操作系统内,如果在就是合法,否则就是非法证书。
申请免费证书
总结
- 对称非对称混合加密解决了HTTP数据传输的安全问题
- 数字证书解决服务端可靠性的问题
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。