Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTPS原理及握手过程 #1

Open
liuhanqu opened this issue Jul 24, 2019 · 6 comments
Open

HTTPS原理及握手过程 #1

liuhanqu opened this issue Jul 24, 2019 · 6 comments

Comments

@liuhanqu
Copy link
Owner

liuhanqu commented Jul 24, 2019

什么是 HTTPS

HTTPS,比 HTTP 多了一个 S,这个 S 可以认为是 secure,即 HTTPS 是安全的 HTTP。

我们知道,HTTP 是运行在 TCP 层之上的,而 HTTPS 则是在 HTTP 和 TCP 层直接多加了一个 SSL/TSL 层,SSL 层向上提供加密和解密的服务,对 HTTP 来说是透明的。

对称加密 vs 非对称加密

加密和解密都使用同一种算法的加密方法,称之为对称加密。加密和解密使用不同的算法,则为非对称加密。

对称加密需要一把钥匙就够了,因为加密和解密使用的是同一把钥匙。

非对称加密算法需要两把钥匙,公钥和私钥,它们是一对。用公钥加密的密文只能用相应的私钥解开,用私钥加密的密文只能用相应的公钥解开。其中,公钥是公开的,私钥是不对外公开的。

两者的主要区别在于密钥的长度不同,长度越长,相应的加/解密花费的时间就会更长,对称加密使用的密钥长度会短一些。

SSL 结合了这两种加密算法的有点。利用非对称加密算法来协商生成对称加密的密钥,然后之后就用对称加密来进行通信。

握手过程

以下主要讨论不需要身份验证的客户端和需要身份验证的服务端之间的握手。

client --> server

Client Hello

握手开始时,总是由先客户端会发送 Client Hello 信息给服务端,主要包含

  • Version Number

    客户端支持的协议版本

  • Randomly Generated Data

    32 字节长度的随机值,用于之后生成主密钥。

  • Session Identification

    Session ID,第一次连接时为空。

  • Cipher Suite

    客户端支持的加密算法列表,按优先级顺序排列。

server --> client

Server Hello

接着,服务端收到客户端发来的消息之后,会返回 Server Hello 信息给客户端,告知客户端接下来使用的一些参数

  • Version Number

    通信协议版本

  • Randomly Generated Data

    32 字节长度的随机值,用于之后生成主密钥

  • Session Identification

    Session ID

  • Cipher Suite

    加密算法

Server Certificate

服务端还会带上证书返回给客户端。证书中含有服务端的公钥、网站地址、证书的颁发机构等信息。

客户端收到服务端返回的证书之后,会验证该证书的真实合法性。

Server Key Exchange

这个是可选的,取决于使用的加密算法。主要是携带密钥交换的额外数据。

Server Hello Done

表示服务端已经发送完毕,并等待客户端回应。

client --> server

Client Key Exchange

客户端使用之前发送给服务端及服务端返回的随机数,生成预主密钥,然后用服务端返回的公钥进行加密。

Change Cipher Spec

告诉服务端,之后的所有信息都会使用协商好的密钥和算法加密

Client Finished

客户端的握手工作已经完成。这条信息是握手过程中所有消息的散列值。

server --> client

Change Cipher Spec Message

告知客户端,会使用刚刚协商的密钥来加密信息

Server Finished Message

表示服务端的握手工作已经完成

完整的握手过程

完整的握手过程如上图所示。

参考资料

@brilliantyy
Copy link

Client Key Exchange那步应该是客户端再次生成一个随机数,并用服务器公钥加密发送给服务端。此时双方各持有三个随机数,之后双方各自用这三个随机数(random1 + random2 + random3作为主密钥)和协商好的加密算法对后续通讯内容加密。

@liuhanqu
Copy link
Owner Author

Client Key Exchange 阶段,不同的加密算法做的事情会有所不同。
随机数用来生成预主密钥,然后预主密钥再生成主密钥和会话密钥。

@brilliantyy
Copy link

Screen Shot 2019-08-25 at 21 36 09

这里的两个随机数服务端已经有了,客户端为什么还要重新传一次

@brilliantyy
Copy link

brilliantyy commented Aug 25, 2019

RFC5246
两种情况:如果用RSA算法协商密钥,是由客户端生成一个46字节随机数,加上2字节的版本信息组成预备主密钥,由服务器公钥加密后发送;如果用DH算法协商,客户端就把DH公钥明文发送给服务器,两边再各自生成 premaster secret(长度不定)。

@liuhanqu
Copy link
Owner Author

liuhanqu commented Mar 9, 2020

数字证书申请流程

  1. 网站提交身份信息给CA机构
  2. CA机构审核信息的真实性
  3. 对信息进行Hash,计算信息摘要
  4. CA机构的密钥加密信息摘要,得到数字签名

image

@liuhanqu
Copy link
Owner Author

liuhanqu commented Mar 9, 2020

浏览器验证证书

  1. 浏览器利用证书的原始信息计算得到信息摘要
  2. 利用CA的公钥解密数字证书中的数字签名,解密出来的数据也是信息摘要
  3. 比较两个摘要是否相等

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants