技术资讯尽在技术周刊
Windows.location.href='http://www.51cto.com/act/weeklyedm0525/edm628';
简述
本文主要介绍 HTTPS 以及 SSL 单向验证和双向验证.
HTTPS 介绍
HTTPS 是一种通过计算机网络进行安全通信的传输协议, 经由 HTTP 进行通信, 利用 SSL/TLS 建立安全信道, 加密数据包. HTTPS 使用的主要目的是提供对网站服务器的身份认证, 同时保护交换数据的安全性与完整性.
HTTP 介绍
HTTP 是超文本传输协议, 是一个基于请求与响应, 无状态的, 应用层的协议, 常基于 TCP/IP 协议传输数据, 互联网上应用最为广泛的一种网络协议, 所有的 WWW 文件都必须遵守这个标准.
SSL/TLS 介绍
TLS 在传输层对网络连接进行加密, 前身是 SSL 协议, 由网景公司 1995 年发布, 用以保障数据在 Internet 上安全地进行传输, 利用数据加密 (Encryption) 技术, 确保数据在网络传输过程中不会被截取或窃听.
数据加密用到了对称加密和非对称加密, TCP 协议建立传输连接时, SSL 首先对对称加密的密钥使用非对称加密的公钥进行非对称加密, 连接建立好之后, SSL 对传输内容使用对称加密.
对称加密, 速度高, 可加密内容较大, 用来加密会话过程中的消息.
非对称加密, 加密速度较慢, 但能提供更好的身份认证技术, 用来加密对称加密的密钥.
OSI 模型
HTTPS 和 HTTP 协议位于应用层, SSL\TLS 协议位于传输层与应用层之间, TCP 协议位于传输层, IP 协议位于网络层. 如下图所示:
图 1 协议模型
SSL 单向验证
客户端执行 HTTPS 请求时, 需要由 TCP 协议建立和释放连接. 这就涉及 TCP 协议的三次握手和四次挥手. 想要了解一文读懂 TCP 三次握手工作原理及面试常见问题汇总和一文读懂 TCP 四次挥手工作原理及面试常见问题汇总的同学, 请点击链接查看.
TCP 连接建立好后, 对于 HTTP 而言, 服务器就可以发送数据给客户端. 但是对于 HTTPS, 它还要运行 SSL/TLS 协议, SSL/TLS 协议分两层, 第一层是记录协议, 主要用于传输数据的加密压缩; 第二层是握手协议, 它建立在第一层协议之上, 主要用于数据传输前的双方身份认证, 协商加密算法, 交换密钥.
SSL 单向验证流程:
图 2 SSL 单向验证流程
SSL 单向验证总共有四步
1)第一步, 客户端向服务器端发起 Client Hello, 请求内容包括:
a. 客户端支持的 SSL/TLS 协议版本列表;
b. 客户端支持的对称加密算法列表;
c. 客户端生成的随机数 A;
2) 第二步, 服务器端回应客户端 Server Hello, 回应内容包括:
a. 双方都支持的 SSL/TLS 协议版本;
b. 双方都支持的对称加密算法;
c. 服务器密钥库中的证书;
d. 服务器端生成的随机数 B;
3) 第三步, 客户端收到服务器端回应, 客户端检查服务器端证书是否合法, 验证内容如下:
a. 服务器端证书是否过期;
b. 服务器端证书是否被吊销;
c. 服务器端证书是否可信;
d. 服务器端证书域名和客户端请求域名是否一致.
验证通过后, 客户端回应服务器端, 回应内容包括:
a. 客户端生成一个 "随机数 C","随机数 C" 也被称为 "pre-master-key", 然后使用服务器端证书中的公钥加密 "随机数 C", 将加密后的 "随机数 C" 发送给服务器端;
4) 第四步, 服务器端使用密钥库中的私钥解密加密后的 "随机数 C" 得到 "随机数 C", 此时客户端和服务器端都拿到了随机数 A, 随机数 B, 随机数 C, 双发通过这 3 个随机数使用相同的密钥交换算法计算得到相同的对称加密密钥, 这个对称加密密钥就作为客户端和服务器端数据传输时对称加密使用的密钥.
服务器端和客户端, 握手结束, 之后就可以用对称加密传输数据了.
SSL 双向验证
SSL 单向验证过程中, 客户端会验证自己访问的服务器端, 服务器端对客户端不做验证. 如果服务器端验证客户端, 则需要开启服务器端验证, 这就是双向验证.
SSL 双向验证和单向验证的不同之处在于:
a. 第二步中服务器端第一次回应客户端的 Server Hello 消息中, 会要求客户端提供客户端证书;
b. 第三步中客户端验证完服务器端证书后, 回应的内容中, 会增加两个信息:
a) 客户端证书;
b) 客户端证书验证消息(CertificateVerify message): 客户端将之前所有收到的和发送的消息组合起来, 并用 hash 算法得到一个 hash 值, 然后用客户端密钥库的私钥对这个 hash 进行签名, 这个签名就是 CertificateVerify message;
c. 服务器端收到客户端证书后, 会做如下处理:
a) 确认客户端发送的证书是有效合法的;
b) 用客户端证书中的公钥验证收到信息中的签名, 以确定这个证书是客户端发出的;
服务器端和客户端, 握手结束, 之后就可以用对称加密传输数据了.
来源: http://news.51cto.com/art/202005/617282.htm