前言
HTTPS 是 HTTP 的“升级”版本:HTTPS = HTTP + SSL/TLS,SSL 是安全层,TLS 是传输层安全,是 SSL 的继承。使用 SSL 或 TLS 可确保传输数据的安全性。
使用 HTTP 可能看到传输数据是: “这是明文信息”。使用 HTTPS 可能看到: “283hd9saj9cdsncihquhs99ndso”。HTTPS 传输的不再是文本,而是二进制流,使得传输更高效,且加密处理更加安全。
流程
- 客户端请求 HTTPS 请求并连接到服务器的 443 端口,此过程和请求 HTTP 请求一样,进行三次握手;
- 客户端和服务器交换它们持有的随机数(记为 R1 和 R2)。
- 服务端向客户端发送数字证书,其中包含公钥、证书颁发者、到期日期、数字签名等等。非对称加密的密钥包括公钥和私钥。公钥用于加密,私钥用于解密。所以服务端会保留私钥,然后发送公钥给客户端。
- 客户端收到证书,会验证证书的有效性。验证通过后会生成一个随机的 Pre-master Key(随机数 R3)。再将密钥通过接收到的公钥加密然后发送给服务端
- 服务端接收后使用私钥进行解密得到 Pre-master Key。
- 客户端服务器这样子就持有了三个随机数 R1、R2、R3,生成双方通信的会话密钥进行通信。
关于安全
HTTPS 的 pre-master key 是用非对称加密传输的,在证书可靠的情况下,保证了主密钥的安全性(如果是采用对称加密,密钥的传输就会被看到)。但是也会出现中间人伪造服务器和客户端进行HTTPS通信再向服务器请求,从而获取与服务器通信的明文信息的情况。
这样子客户端就需要知道服务器的公钥是不是真的服务器的公钥,这一步就是通过 CA,Certificate Authority 背书,CA 可以证明服务器的公钥是真的。
在服务器发送数字证书时,会使用 CA 提供的证书的私钥对明文的 Hash 进行加密,客户端收到后,会校验证书的网址、过期时间等内容,还会使用预装在操作系统或者浏览器的 CA 证书公钥对数字证书进行解密,并且对比是否与明文的 Hash 相等。如果中间人截取 HTTPS,它用它自己生成的公钥私钥替代 CA 机构的公钥私钥,浏览器会使用本地存储的 CA 公钥解密,解不开说明是不可信的。如果 Hash 不相等说明通信的内容被篡改过,此次连接也是不可信的。(如果操作系统或者浏览器没有被做过手脚的话)
流程图解
sequenceDiagram
note left of Client: 生成随机数 R1
note right of Client: 随机数 R1、客户端支持的加密算法
Client->>Server: Client Hello
Server->>Client: ACK
note right of Server: 生成随机数 R2
note left of Server: 随机数 R2、会话密钥生成算法、TLS 版本
Server->>Client: Server Hello
note right of Server: 使用 CA 私钥加密明文的 Hash 形成数字签名
note left of Server: 服务端证书
包含证书格式、版本号、序列号、有效期、颁发者、服务器公钥、数字登名...
Server->>Client: Server Certificent
Server->>Client: Server Hello Done
Client->>Server: ACK
note left of Client: 在发送ACK后
1、先验证明文部分,看看是否过期,网址是否正确。
2、再用在操作系统或者浏览器上内置的 CA 公钥把数亨签名解密。
然后判断和证书中的明文的hash值是否相等,
不相等说明被篡改了,停止交易(x)。
3、验证阶段还有一些其他东西,比如如果找不到这个CA证书。
服务器会返回一个证书,让你选择是否信任。
note left of Client: 生成随机数 R3。然后用公钥加密 R3 生成一个 Pre-Master Key
note right of Client: 随机数 R3,即 Pre-Master Key
Client->>Server: Client Key Exchange
note right of Server: 服务器使用私钥解密获得 R3,
此时双方都拥有 3 个随机数 R1、R2、R3,
通过双方选择的加密算法计算出会话密钥 Session Key
note right of Client: 表示后续使用会话密钥进行通信
Client->>Server: Change Cipher Spec
note right of Client: 会话握手所有数据的 Hash
Client->>Server: Finish
Server->>Client: ACK
note right of Server: 验证 Hash 是否和自己算出来的一样
Server->>Client: Change Cipher Spec
note left of Server: 会话握手所有数据的 Hash
Server->>Client: Finish
Client->>Server: ACK
Note over Client,Server: 之后使用会话密钥进行加密通信
0 条评论未登录用户
Ctrl or + Enter 评论
