浏览器、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证书的认证过程相比,自建证书首先需要把服务器证书安装至客户端中。待客户端收到服务器发送过来的证书信息时,就使用这个证书校验服务的合法性。如果校验成功,则进行下一步,如果失败,断开连接。
此致
网友评论