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

SSL或TLS握手的概述 #3

Open
lvwxx opened this issue Mar 29, 2019 · 0 comments
Open

SSL或TLS握手的概述 #3

lvwxx opened this issue Mar 29, 2019 · 0 comments
Labels
network network basis

Comments

@lvwxx
Copy link
Owner

lvwxx commented Mar 29, 2019

SSL或TLS握手的概述

SSL或TLS握手建立了用于客户端和服务端通信的秘钥。

客户端和服务端SSL或TLS能够相互通信的基本步骤:

  • 确认使用协议的版本
  • 选择加密算法
  • 通过交换和验证数字证书对彼此进行身份验证
  • 使用非对称加密技术生成共享密钥,避免了密钥分发问题。然后SSL或TLS使用共享密钥对消息进行对称加密解密,这比非对称加密更快

综上所述SSL握手的步骤如下:

  1. SSL或TLS客户端先向服务端发送一个加密通信请求,叫做ClientHello请求。该请求包含以下信息:
    • 客户端支持的SSL或者TLS版本
    • 客户端生成的随机数,用于生成后续通信的随机字符串("对话密钥")
    • 客户端支持的加密算法
  2. SSL或TLS服务端收到客户端请求后,向客户端发出响应,叫做ServerHello。该响应包含以下信息:
    • 服务端从客户端提供的SSL或TLS列表中选择的版本
    • Sesstion ID 和 另外生成的随机数
    • 服务端的数字证书(如果服务端需要用于客户端身份验证的数字证书,则服务端发送一个客户端证书请求,其中包含受支持的证书类型列表和可接受的认证机构(CAs)的专有名称。)
    • 确认使用的加密算法
  3. 客户端收到服务端响应后,首先校验服务端发来的数字证书决定是否继续通信。
  4. 证书校验通过,会像服务端发送以下信息:
    • 生成一个随机数,并对这个随机数用从服务端数字证书中取出的公钥加密(用与生成后续通信的“随机密钥”)
  5. 如果服务端发送了一个客户端证书请求,客户端将会发送一个用客户端私钥加密的随机字符串和客户端的数字证书,或者没有数字证书的警告。在某些强制客户端证书的实现中,如果客户端没有数字证书责握手会失败
  6. 服务端接受并验证客户端证书
  7. 服务端用之前的3个随机数和商定好的加密方法计算生成会话密钥,之后双方用这个会话密钥通信。
  8. 客户端向服务端发送一条完成的消息,该消息使用密钥加密,表示握手的客户端部分已经完成。
  9. 服务端向客户端发送一条完成的消息,该消息使用密钥加密,表示握手的服务端部分已经完成
  10. 在SSL或TLS会话期间,服务端和客户端现在可以交换使用共享密钥对称加密的消息
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
network network basis
Projects
None yet
Development

No branches or pull requests

1 participant