HTTPS握个手
date
Jun 19, 2023
slug
HTTPS握个手
status
Published
tags
IT
HTTP
summary
HTTPS握个手
type
Post
HTTPS 握个手
在开始 HTTPS 之前,我们先来了解下 对称加密 和 非对称加密<a name="y45qf"></a>
对称加密
对称加密不难理解,就是加密和解密使用相同的密钥,比如文本
"a"
使用 "123"
加密后的密文,用 "123"
作为密钥可以解密出文本 "a"
,常见的对称加密有 AES、DES、3DES。
非对称加密
非对称加密,顾名思义就是加密的密钥和解密的用的不一样。我们先来看看知乎的这篇高分回答如何用通俗易懂的话来解释非对称加密?
首先,每个用户都有两把钥匙,一把公钥一把私钥。公钥是对外发布的,所有人都看的到所有人的公钥,私钥是自己保存,每个人都只知道自己的私钥而不知道别人的。
用该用户的公钥加密后只能该用户的私钥才能解密。这种情况下,公钥是用来加密信息的,确保只有特定的人(用谁的公钥就是谁)才能解密该信息。 下面我拿A银行和小明来举例子吧。假设这2者之间是用不对称的加密算法来保证信息传输的安全性(不被第三人知道信息的含义及篡改信息)。大致流程如下:首先小明发了一条信息给A银行“我要存500元”。这条信息小明会根据A银行的对外发布的公钥把这条信息加密了,加密之后,变成“XXXXXXX”发给A银行。中间被第三者截获,由于没有A银行的私钥无法解密,不能知道信息的含义,也无法按正确的方式篡改。所以拿这条加密信息是没办法的。最后被A银行接受,A银行用自己的私钥去解密这条信息,解密成功,读取内容,执行操作。然后得知消息是小明发来的,便去拿小明的公钥,把“操作成功(或失败)”这条信息用小明的公钥加密,发给小明。同理最后小明用自己的私钥解开,得知知乎发来的信息内容。其他人截获因为没有小明的私钥所以也没有用。
还有第二种情况,公钥是用来解密信息的,确保让别人知道这条信息是真的由我发布的,是完整正确的。接收者由此可知这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。 怎么理解呢?继续拿小明和银行A举例子。银行A发布了一个银行客户端的补丁供所有用户更新,那为了确保人家下载的是正确完整的客户端,银行A会为这个程序打上一个数字签名(就是用银行A的私钥对这个程序加密然后发布),你需要在你的电脑里装上银行A的数字证书(就是银行对外发布的公钥),然后下载好这个程序,数字证书会去解密这个程序的数字签名,解密成功,补丁得以使用。同时你能知道这个补丁确实是来自这个银行A,是由他发布的,而不是其他人发布的。
常用的非对称加密有 RSA。
HTTP + S ==> HTTPS
我们先来看看 HTTP 和 HTTPS 的对比。<br />
HTTPS凭什么就能做到机密性、完整性这些安全特性呢? 秘密就在于HTTPS名字里的“S”,它把 HTTP 下层的传输协议由 TCP/IP 换成了 SSL/TLS,由“HTTP over TCP/IP”变成了“HTTP over SSL/TLS”,让HTTP运行在了安全的 SSL/TLS 协议上,收发报文不再使用Socket API,而是调用专门的安全接口
所以 HTTPS 安全的核心就是 SSL/TLS 协议,SSL/TLS 协议的握手就是建立连接和交换参数,交换客户端与服务器之间的信息从而生成会话秘钥(主秘钥),用来加密之后的消息。
可以这么理解,握手过程的信息用到了非对称加密,而建立连接之后的信息通信,是对称加密。
SSL/TLS 协议握手过程
TLS中有两种主要的握手类型:一种基于RSA,一种基于Diffie-Hellman。 这两种握手类型的主要区别在于主秘钥交换和认证上。
ㅤ | 秘钥交换 | 身份验证 |
RSA握手 | RSA | RSA |
DH握手 | DH | RSA/DSA |
RSA握手
基于 RSA 的 TLS 握手整个流程如下如所示<br />
- 客户端向服务器发送Client Hello,告诉服务器,我支持的协议版本,加密套件等信息。
- 服务器收到响应,选择双方都支持的协议,套件,向客户端发送Server Hello。同时服务器也将自己的证书发送到客户端(Certificate)。
- 客户端自己生产预主密钥,通过公钥加密预主秘钥,将加密后的预主秘钥发送给服务器 (Client Exchange)。
- 服务器用自己的私钥解密加密的预主密钥。
之后,客户端与服务器用相同的算法根据客户端随机数,服务器随机数,预主秘钥生产主密钥,之后的通信将都用主密钥加密解密。握手过程需要注意以下三点
DH握手
TLS握手采用DH算法的流程图
- 客户端向服务器发送 Client Hello, 告诉服务器,我支持的协议版本,加密套件等信息。
- a. 服务端收到响应,选择双方都支持的协议,套件,向客户端发送 Server Hello。同时服务器也将自己的证书发送到客户端(Certificate)。b. 服务器利用私钥将客户端随机数,服务器随机数,服务器 DH 参数签名,生成服务器签名。
- 服务端向客户端发送服务器 DH 参数以及服务器签名(Server Key Exchange)。
- 客户端向服务端发送客户端 DH 参数(Client Key Exchange)。
之后,客户端利用公钥验证服务器签名,客户端与服务器各自利用服务端DH参数、客户端DH参数生成预主密钥,再通过预主密钥、客户端随机数、服务端随机数生成主密钥(会话密钥)。最后握手完成,所有的消息都通过主密钥加密.
总结
RSA 握手和 DH 握手的主要差别,在于 RSA 是通过公钥加密的预主密钥发送给服务端,而 DH 握手前两步的验证身份和 RSA 握手一致,在交换密钥时是通过各自发送 DH 参数完成密钥交换。之后算出共同的会话主密钥,用于会话加密。目前的 SSL/TLS 协议 主流是基于 RSA 握手。
参考文章
《透视HTTP协议》-https<br /><br />HTTPS篇之SSL握手过程详解