浏览器、HTTP、SSL、HTTPS执行流程 - Go语言中文社区

浏览器、HTTP、SSL、HTTPS执行流程


浏览器、HTTP、SSL、HTTPS执行流程

当在浏览器中输入URL后,页面加载完成的过程中都发生了什么事情

1、解析URL

  • 判断URL是否是合法的URL,如果URL不合法,则调用默认的搜索引擎,直接把输入的内容作为要搜索的内容进行搜索,如果URL合法,则继续下一步。
  • 检查这些请求是HTTPS还是HTTP,如果是HTTPS的话则使用HTTPS协议进行访问,否则使用HTTP协议发送。有些情况下,第一个请求不是HTTPS的,但是当浏览器向网站发出第一个HTTP请求之后,网站会返回浏览器一个响应,请求浏览器使用HTTPS发送请求。
  • 将URL进行字符转换

2、查找IP地址

  • 先检查浏览器的缓存,看看所要访问的域名是否存在于缓存之中,如果存在,则直接使用缓存中的IP地址进行访问,如果不存在,执行下一步
  • 缓存中没有找到,则调用系统的gethostbyname库函数,进行查询,gethostbyname函数会先检查域名是否在本地的Hosts文件中,如果找到直接返回域名对应的IP,(这也当访问不到某网址时,修改hosts文件的原因)如果没有找到则执行下一步
  • 向DNS服务器发送一个域名查询请求,然后就执行DNS查询过程,这个过程一般情况下会返回所要访问域名对应的IP地址,除非域名真的不存在,或者DNS服务器出现故障。

3、建立连接

  • 当浏览器得到了目标服务器的 IP 地址,以及 URL 中给出来端口号(http 协议默认端口号是 80, https 默认端口号是 443),它会调用系统库函数 socket ,请求一个 TCP流套接字。进行网络数据的传输。

  • 连接建立之后,则根据HTTP协议进行数据交换,资源通常是 HTML 文件,也可能是 PDF,图片,或者其他类型的内容。

4、页面渲染

  • 浏览器获得资源文件后,HTML,css,js等文件则根据自身内核的机制,进行页面渲染,然后呈现给用户。

参考资料

当···时发生了什么? 从输入 URL 到页面加载完成的过程中都发生了什么事情? 在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?


SSL

SSL协议

1、背景

  • 背景就不多做介绍了,想要了解的可以查看参考文献。

2、协议的执行过程 (握手)

SSL握手过程可以分为三种:

  • 只验证服务器的SSL握手过程
  • 验证服务器和客户端的SSL握手过程
  • 恢复原有会话的SSL握手过程

这三种过程在文献一SSL身份认证原理中都有所介绍,可以跳转去查看,这里我们以第一种握手过程着重介绍一下。

只验证服务器的SSL握手过程

借用文献二图解SSL/TLS协议中的一张图

假定客户端叫做爱丽丝,服务器叫做鲍勃,其验证步骤为:

  • 爱丽丝(浏览器)给出协议版本号、一个客户端生成的随机数(随机数A),以及客户端支持的加密方法。
  • 鲍勃(服务器)确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(随机数B)。
  • 爱丽丝(浏览器)确认数字证书有效,然后生成一个新的随机数(随机数C),并使用数字证书中的公钥,加密这个随机数,发给鲍勃(服务器)。
  • 鲍勃(服务器)使用自己的私钥,获取爱丽丝(浏览器)发来的随机数(随机数C)
  • 爱丽丝(浏览器)和鲍勃(服务器)根据约定的加密方法,使用前面的三个随机数(A,B,C),生成"对话密钥"(session key),用来加密接下来的整个对话过程。

我们可以发现,在握手的开始结果,双方使用的RSA非对称加密方式,而握手完成之后,两者的通信则是使用对称加密方式。为什么呢,当然是为了效率,非对称加密安全,但是所耗资源大;对称加密简单,效率比较高。 这样也许还不够清晰,下面我们来抓包看一下: 再盗用一张图:

  • SSL客户端通过Client Hello消息将它支持的SSL版本、加密算法、密钥交换算法、MAC算法等信息发送给SSL服务器。 如图:

    SSL版本 TLS 1.2 Random 随机数A Cipher suites 支持的加密算法列表

  • SSL服务器发送 Server Hello 消息确定本次通信采用的SSL版本,,随机数B,服务器证书和加密套件,如果SSL服务器允许SSL客户端在以后的通信中重用本次会话,则SSL服务器会为本次会话分配会话ID,并通过Server Hello消息发送给SSL客户端。抓包显示此次会话,占用了三个数据包。 如图:

    Version: TLS 1.2 确认使用的协议版本 Random 随机数B Session ID Length:0 不重用此次会话,不分配会话ID Cipher Suite 确认使用的加密算法 HandShake Protocol:Certificate 提供服务器证书 HandShake Protocol:Server Key Exchange 发送服务器使用的DH参数 HandShake Protocol:Server Hello Done server hello结束

  • SSL客户端验证SSL服务器的证书合法后,利用证书中的公钥加密SSL客户端随机生成的随机数C,并通过Client Key Exchange消息发送给SSL服务器,并发送Change Cipher Spec消息,通知SSL服务器后续报文将采用协商好的密钥和加密套件进行加密和MAC计算 如图:

    HandShake Protocol:Client Key Exchange 发送浏览器使用的DH参数 HandShake Protocol:Change Cipher Spec 发送Change Cipher Spec消息,通知服务器开始使用加密方式发送报文

  • 服务器端发送change_cipher_spec和finished消息,通知浏览器握手结束,使用加密通话 如图:

HandShake Protocol:Change Cipher Spec 发送Change Cipher Spec消息,通知浏览器开始使用加密方式发送报文,结束握手

参考文献

SSL身份认证原理 图解SSL/TLS协议 数字证书原理 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证 OpenSSL 与 SSL 数字证书概念贴


证书

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请(CA证书)。区别就是自己颁发的证书(自建证书)需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。

CA证书

CA 机构,又称为证书认证中心 (Certificate Authority) 中心,是一个负责发放和管理数字证书的第三方权威机构,它负责管理PKI结构下的所有用户(包括各种应用程序)的证书,把用户的公钥和用户的其他信息捆绑在一起,在网上验证用户的身份。CA机构的数字签名使得攻击者不能伪造和篡改证书。

证书里包含了什么?

一个标准的X.509数字证书包含以下一些内容:

  • 证书的版本信息;
  • 证书的序列号,每个证书都有一个唯一的证书序列号;
  • 证书所使用的签名算法;
  • 证书的发行机构名称,命名规则一般采用X.500格式;
  • 证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
  • 证书所有人的名称,命名规则一般采用X.500格式;
  • 证书所有人的公开密钥;
  • 证书发行者对证书的签名。

当我们访问一个支持HTTPS的网站时,其认证过成为: 1、网站运行者向向一个证书发布机构"SecureTrust CA"为我们自己的公司"ABC Company"申请了一张证书,注意,这个证书发布机构"SecureTrust CA"是一个大家公认并被一些权威机构接受的证书发布机构,一般情况下,我们的操作系统里面已经安装了"SecureTrust CA"的证书。 2、运维将证书部署至网站服务器 3、客户端向服务器发送通信请求 4、服务器将自己申请的证书发送给客户端 5、客户端拿到服务器传过来的证书后,就开始验证证书有效性的过程。

  • 首先应用程序(浏览器)读取证书中的Issuer(发布机构)为"SecureTrust CA" ,然后会在操作系统中受信任的发布机构的证书中去找"SecureTrust CA"的证书,如果找不到,那说明证书的发布机构是个水货发布机构,证书可能有问题,程序会给出一个错误信息。
  • 如果在系统中找到了"SecureTrust CA"的证书,那么应用程序就会从证书中取出"SecureTrust CA"的公钥,然后对我们"ABC Company"公司的证书里面的指纹和指纹算法用这个公钥进行解密,
  • 然后使用这个指纹算法计算"ABC Company"证书的指纹,将这个计算的指纹与放在证书中的指纹对比,如果一致,说明"ABC Company"的证书肯定没有被修改过并且证书是"SecureTrust CA" 发布的,证书中的公钥肯定是"ABC Company"的。
  • 对方然后就可以放心的使用这个公钥和我们"ABC Company"进行通信了。 以上过程也就包含了SSL的握手过程。
  • 之后的通信就使用协商好的秘钥进行加密通信。
自建证书

申请CA证书,需要不菲的费用,我们也可以自己制作一个证书,证书的内容和CA差不多,即自建证书。 自建证书的过程就不多介绍了,我们只说流程。 使用自建证书的认证过程与CA证书的认证过程相比,自建证书首先需要把服务器证书安装至客户端中。待客户端收到服务器发送过来的证书信息时,就使用这个证书校验服务的合法性。如果校验成功,则进行下一步,如果失败,断开连接。

此致

作者:凌巅 链接:https://www.jianshu.com/p/c2bf75485c15 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lulitianyu/article/details/79184271
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 14:40:18
  • 阅读 ( 1485 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢