HTTPS SSL 握手流程 - Go语言中文社区

HTTPS SSL 握手流程


HTTP与HTTPS流程比较

在发送已加密的HTTP报文之前,客户端和服务器要进行一次SSL握手,在这握手过程中,他们要完成以下工作:

  • 交换协议版本号
  • 选择一个两端都了解的密码
  • 对两端的身份进行认证
  • 生成临时的会话秘钥,方便加密信道

  1.  DNS解析(通过访问的域名找出其IP地址,递归搜索)
  2. HTTP请求,当输入一个请求时,建立一个Socket连接发起TCP的3次握手
  3. 如果是HTTPS请求建立连接后,则看Q26
  4. 客户端向服务器发送请求命令(一般是GET或POST请求)
  5. 客户端发送请求头信息
  6. 服务器发送应答头信息
  7. 服务器向客户端发送数据
  8. 服务器关闭TCP连接(4次挥手)

 SSL握手的简化版

第一个随机数由client生成,第二个随机数由server生成。

第三个随机数由client生成,使用server的公钥加密,并发送给server。第三个随机数即图中的Premaster secret。这个过程中,Premaster secret只有client和server知道,不会泄露。

然后client和server根据三个随机数生成一个session key,即接下来数据传输过程中用到的对称秘钥。

总结来说就是一共生成三个随机数,根据三个随机数创建一个对称加密的秘钥。前两个随机数可以被抓包拿到,但是第三个随机数已经使用非对称加密算法加密过,所以最终生成的秘钥是保密的。

双向验证
 

建立连接的过程:

  1. 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息;

  2. 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书;

  3. 客户端使用服务端返回的信息验证服务器端的合法性,包括:

    (1)证书是否过期
    (2)颁发服务器证书的CA是否可靠
    (3)返回的公钥是否能正确解开返回证书中的数字签名
    (4)服务器证书上的域名是否和服务器的实际域名相匹配
    验证通过后,将继续进行通信,否则,终止通信;

  4. 服务端要求客户端发送客户端的证书,客户端会将自己的证书发送至服务端

  5. 验证客户端的证书,通过验证后,会获得客户端的公钥

  6. 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择;

  7. 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式

  8. 将加密方案通过使用之前获取到的公钥进行加密,返回给客户端;

  9. 客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后,产生该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端;

  10. 服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。

参考:http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

HTTP/2幕后原理

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/huaishu/article/details/88994282
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 12:34:29
  • 阅读 ( 961 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢