阅读本文约需要10分钟,您可以先关注我们或收藏本文,避免下次无法找到。
01 前言
二十一世纪,我们的工作、生活早已离不开Internet。Internet是利用通信设备(路由器、交换机等)和线路将全世界不同地理位置的服务器、计算机互联起来,用户再通过各种网络软件实现网络资源共享和信息交换的网络。
我们上网最常用的就是访问各个网站获取自己想要的信息。想搜索某一条信息时,大家就会打开百度进行检索。
我们可以发现,现在的网站在输入URL网址时,基本都是HTTPS开头的。但是在早些年,大部分网站都是HTTP开头的,少了一个"s"。
02 HTTPS的作用
那为何现在的网站基本都是用HTTPS呢?
对于用户而言,最显著的区别就是PC和远端服务器之间的数据传输加密了,这样可以防止"不法分子"获取个人信息。
比如在进行登录时,要是明文传输的话,你的账号密码就可能被"不法分子"获取。甚至在线支付时,可能会暴露的你银行卡信息,这是非常严重的信息安全事件。
如下如所示,某论坛就没有使用HTTPS,我们在输入登录信息后,点击"登录"按钮,通过Wireshark抓包工具,可以抓到我们的登录信息mobile:1903453090,imgCode:9496,code:1234。
如果这里再涉及账号密码等信息,那就很危险了。可能有人想说这种不加密的网站,账号密码被盗就被盗了呗,也没有什么值钱的东西,但是你转念想想,你的微信、支付宝的密码是否和这个网站使用的是一样的?
03 HTTPS的加密原理
我们先看下HTTP协议和HTTPS协议在TCP/IP协议栈中的区别。
很明显,HTTPS只是比HTTP协议多了一层SSL协议,没错,HTTPS之所以可以加密,主要就是因为有了SSL层。
SSL协议从以下方面确保了数据通信的安全:
身份认证:在建立SSL连接之前,客户端和服务器之间需要进行身份认证,认证采用数字证书,可以是客户端对服务器的认证,也可以是双方进行双向认证。
机密性:采用加密算法对需要传输的数据进行加密。
完成性:采用数据鉴别算法,验证所接收的数据在传输过程中是否被修改。
04 SSL协议结构
SSL协议可以分为两层:
底层为SSL记录协议(SSL record protocol)
主要负责对上层的数据进行分块、压缩、计算并添加MAC、加密,最后把记录块传输给对方。
上层为SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)
SSL握手协议:客户端和服务器通过握手协议建立一个会话。会话包含一组参数,主要有会话ID、对方的证书、加密算法列表(包括密钥交换算法、数据加密算法和MAC算法)、压缩算法以及主密钥。SSL会话可以被多个连接共享,以减少会话协商开销。
SSL密码变化协议:客户端和服务器端通过密码变化协议通知接收方,随后的报文都将使用新协商的加密算法列表和密钥进行保护和传输。
SSL警告协议:用来允许一方向另一方报告告警信息。消息中包含告警的严重级别和描述。
05 SSL握手协议
SSL协议最重要的就是SSL握手协议,这里我们也重点介绍该协议:
(1)SSL 握手协议第一阶段
建立起安全能力属性,客户端发送一个client_hello消息,包括以下参数:
版本:消息中协议版本是两个byte长度分别表示主次版本。目前SSL拥有的版本有SSLv1.0、SSLv2.0、TSLv1.0(即SSLv3)、TSLv1.1、TSLv1.2。
随机数: 32位时间戳+28字节随机序列,用于在后面计算所有消息的摘要或计算主密钥
会话ID:SSL会话ID标识一次会话用,可以重用。
客户支持的密码算法列表(CipherSuite):密钥套件列表,列表中包含了Client端支持的所有密钥套件。
客户支持的压缩方法列表:客户端支持的压缩算法列表,填0表示空。
当服务器收到包含以上信息的client hello 数据包后,服务器发送server_hello消息,并包括以下参数:
版本:服务器拿出client hello消息中的版本号,再看看自己支持的版本列表,选择两者都支持的最高版本号定为这次协商出来的SSL协议使用的版本。
服务器产生的随机数:此处产生的随机数与client hello消息中的类似。
会话ID:服务端检测到传过来的session ID是空或者检索session 列表没有发现传过来的session id就会新建一个。
服务器从客户建议的密码算法中挑出一套(Ciphersuit )密码算法。
服务器从客户建议的压缩方法中挑出一个压缩算法。
(2)SSL 握手协议第二阶段
Server certificate消息(可选)
一般情况下,除了会话恢复时不需要发送该消息,在SSL 握手的全流程中,都需要包含该消息。消息包含一个X.509证书,证书中包含公钥,发给客户端用来验证签名或在密钥交换时候给消息加密。
Server Key Exchange(可选)
根据之前在hello信息中包含的ciphersuit信息,决定了密钥交换方式(例如RSA或者DH),因此在server key exchange消息中便会包含完成密钥交换所需的一系列参数。
Certificate Request(可选)
服务器端发出client cert request 消息,要求客户端发他自己的证书过来进行验证。该消息中包含server端支持的证书类型(RSA, DSA, ECDSA等。。。)和server端所信任的所有证书发行机构的DN(Distinguished Name)列表,客户端会用这些信息来筛选证书。
Server Hello Done.
该消息表示server已经将所有信息发送完毕,接下来等待client端的消息。
(3)SSL 握手协议第三阶段
Client certificate(可选):
如果在第二阶段server端要求发送客户端证书,客户端便会在该阶段将自己的证书发送过去。Server端在之前发送的certificate request消息中包含了server端所支持的证书类型和CA列表,因此客户端会在自己的证书中选择满足这两个条件的第一个证书发送过去。若客户没有证书,则发送一个no_certificate警告。
Client Key exchange:
根据之前从server端收到的随机数,按照不同的密钥交换算法,算出一个pre-master,发送给server端,server端收到pre-master算出main master.而客户端当然也能自己通过pre-master算出main master.如此以来双方就算出了对称密钥。
Certificate verify(可选):
只有在客户端发送了自己证书到服务器端,这个消息才需要发送。其中包含一个签名,对从第一条消息以来的所有握手消息的HMAC值(用master_secret)进行签名。
(4)SSL 握手协议第四阶段
建立起一个安全的连接,客户发送一个change_cipher_spec消息,并且把协商得到的CipherSuite拷贝到当前连接的状态之中。然后,客户用新的算法、密钥参数发送一个finished消息,这条消息可以检查密钥交换和认证过程是否已经成功。其中包括一个校验值,对所有以来的消息进行校验。服务器同样发送change_cipher_spec消息和finished消息。握手过程完成,客户和服务器可以交换应用层数据。
好了,你是否已经了解了HTTP和HTTPS的区别了,SSL的加密过程是否了解。如有疑问,欢迎在下方留言讨论。
--喜欢请点击@IT管理局关注我们哦--
本局精彩文章:
Wireshark数据包分析三板斧
一文秒懂 TCP/IP实际五层结构(下篇) |