https的通信加解密过程
- 对称加密和非对称加密
对称加密:加密和解密使用同样的密钥
非对称加密:加密和解密使用不用的密钥,使用一对密钥,公钥(public key)是每个人都能拿到的公开的,私钥(private_key)只有自己知道
对称加密过程
@startuml
title 对称加密过程
actor 客户端 as client
participant 服务端 as server
client -> server : 发送一个随机数 client_random 和一个加密的方法列表
client <-- server : 返回另一个随机数 server_random 和加密方法
client -> client : 用这个加密方法将两个随机数混合起来生成密钥
server <-- server : 用这个加密方法将两个随机数混合起来生成密钥
@enduml
非对称加密过程
@startuml
title 非对称加密过程
actor 客户端 as client
participant 服务段 as server
client-> server:发送一个随机数 client_random和一个加密方法
client<-server:返回另一个随机数 server_random、加密方法和公钥(服务器里面一对公私钥)
client->client:在收到后,在客户端使用服务器的公钥和加密方法把两个随机数混合起来生成一个密钥
client->server:发送会话密钥
server<-server:使用服务端私钥解密的到会话密钥
@enduml
2数字证书
数字证书是一种网络上证明持有者身份的文件,同时还包含有公钥
数字证书在 SSL/TLS 传输过程中扮演身份认证和密钥分发的功能
数字证书认证过程
@startuml
title 数字证书认证过程
participant 第三方认证机构CA as CA
participant 服务端 as server
server -> CA : 这是我的公钥匙,请给我制作一份数字证书
CA <-- CA : 把持有者的公钥、⽤途、颁发者、有效时间等信息打包进⾏ Hash 计算得到⼀个 Hash 值
CA <-- CA : 使⽤⾃⼰的私钥将该 Hash 值加密(签名)
CA <-- CA : 生成数字证书
server <-- CA : 颁发数字证书
actor 客户端 as client
server -> client : 发送数字证书
client -> client : 验证数字证书
@enduml
@startuml
title HTTPS 协议的加解密过程
actor 客户端 as client
participant 服务端 as server
client -> server : ClientHello(你好呀,我请求建立 HTTPS 安全连接,包里是我支持的 SSL/TLS 版本和加密组件)
client <-- server : SeverHello(收到,我选择好 SSL/TLS 版本和加密组件了,放包里了)
client <-- server : Certificate(这是我的数字证书,我的公开密钥在证书里)
client <-- server : ServerHelloDone(我的握手信息已经发送完毕了~)
client -> client : 验证下服务端的数字证书
client -> client : ClientKeyExchange(我先来生成一个对称加密秘钥 master_secret,然后用服务端数字证书中的公开密钥来加密这个 master_secret)
client -> server : ChangeCipherSpec(这是用你的公开密钥加密过的会话密钥,请查收)
client -> server : Client Finish(没问题的话后面我给你发的消息就都用会话密钥来加密了哈~)
server <-- server : 使用我的私有密钥来解密一下,得到 master_secret
client <-- server : ChangeCipherSpec(我已经得到会话密钥了,之后的消息我就都加密发送了)
client <-- server : Server Finish(完毕)
@enduml
总结
1HTTPS 的通信加解密过程基本是客户端先向服务端提出通信请求;然后服务端把包含了公钥的数字证书发给客户端;客户端拿到数字证书后先验证证书的可靠性,验证通过后生成对称加密的会话密钥,并把会话密钥使用服务端的公钥进行加密后发给服务端;服务端收到加密后的会话密钥后,使用私钥解密,得到会话密钥;然后双方使用会话密钥加密通信信息,收到信息后同样适用会话密钥进行解密即可。
2数字证书可以让服务器向浏览器证明自己的身份避免被假冒,并且可以安全的把公钥传给浏览器,所以使用数字证书可以更加安全。