计算机网络——HTTPS协议

HTTPS协议

HTTP通信的问题说明以及处理

HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何形式的数据加密。

HTTP的问题

  • 通信使用明文,即不加密,内容有可能被窃听,如抓包
  • 不验证通信方的身份,有可能遭遇伪装
  • 无法验证报文的完整性,内容有可能被修改。

HTTPS = HTTP + 加密 + 认证 + 完整性保护

HTTP可以通过SSL或者TLS来加密HTTP通信。用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了,与SSL组合使用的HTTP被称为HTTPS。HTTPS是对通信进行加密,而不是内容加密。

SSL是一个私有协议,TLS是一个公有协议,是针对SSLv3的改版

还可以对HTTP发送的内容进行加密,此种方式要求双方同时具备加密和解密机制。

SSL提供证书来确定通信方的身份。SSL证书由值得信任的第三方机构进行颁发,用以证明服务器和客户端是实际存在的。

SSL是一个不依赖于平台和应用程序的协议,用于保障TCP-based应用安全,SSL在TCP和应用层之间,就像应用层连接到TCP连接的一个接口。

报文在传输的过程中,遭攻击者拦截并篡改内容的攻击成为中间人攻击。常用MD5和SHA-1等散列值校验的方法以及用来确定文件的数字签名方法来确定报文完整性。这些方法无法百分百保证确认结果正确。

HTTPS不是一种新的传输协议,只是HTTP的通信接口部分用SSL和TLS协议替代,SSL协议依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。

通常,HTTP直接和TCP进行通信。当使用SSL时,HTTP先和SSL通信,然后由SSL和TCP进行通信。

SSL是独立于HTTP的协议,其他应用层协议均可配合SSL协议使用。

加密技术

对称**加密和非对称**加密

SSL采用公开**加密的加密处理方式。即加密算法公开,**保密。

共享**加密:也叫对称**加密,即加密和解密使用同一个**的方式。

因为共享**加密要安全地转交**,并且还得设法安全的保管接受到的**,因此出现了公开**加密,很好的解决了这个问题。

公开**加密使用一对非对称的**。私有**用来解密,公开**可以随便发布。

发送方通过公开**对发送的内容进行加密,接收方接收到内容后用私有**来进行解密。通过密文和公开**恢复信息原文异常困难,解密过程就是在对离散对数进行求值。

公开**加密的问题

  1. 如何保证公钥不被篡改

    解决办法:将公钥放在数字证书中。只要证书可信,公钥就可信。

  2. 公开**加密计算量太大,如何减少耗用时间

    解决办法:每次对话都生成一个对话**(session key),用它来加密信息。由于对话**是对称加密,因此运算速度非常快,而服务器的公钥只用于加密对话**,由此减少了加密运算的消耗时间。

混合加密

HTTPS使用共享**加密和公开**加密两者并用的混合加密机制。

在交换**环节使用公开**加密方式,之后建立通信交换报文阶段使用共享**加密方式。

  • 使用公开**加密方式对共享加***进行加密,此为握手阶段
  • 然后使用加密后的共享加***对内容进行加密通信。

RSA加密算法

RSA加密算法是一种非对称加密算法,1977年提出,在公开**加密和电子商业中被广泛使用。

几个数学概念

互质

若两个正整数除了1之外没有其他的公因子,就成这两个数为互质关系

构成互质关系的情况:

  • 任意两个质数构成互质关系
  • 一个数是质数,另一个数只要不是其倍数,两个数就可构成互质关系
  • 任意两个数中,较大的数为质数
  • 1和任意一个自然数
  • p为整数,p和p-1构成互质关系
  • p为大于1的奇数,p和p-2构成互质关系

欧拉函数

欧拉函数用来计算不大于一个数的正整数中有多少个数可以与其构成互质关系。用φ(n)表示。

  • 若n是两个质数p和q的乘积,则一定有
    φ(n)=(p1)(q1) φ(n) = (p - 1) * (q - 1)

  • 若n和e互质,则

aφ(n)=1(modn) a^{φ(n)} = 1(mod\:n)

模反函数

若两个正整数a和n互质,则一定存在一个正整数d,使得a * b % n = 1;

**的生成步骤

  1. 随机选择两个不相等的质数p和q
  2. 计算p和q的乘积n
  3. 计算n的欧拉函数φ(n) = (p - 1) * (q - 1);
  4. 随机选择一个整数e,使得1 < e < φ(n),且e与φ(n)互质
  5. 计算e对于φ(n)的模反元素d
  6. 将n和e封装成公钥,n和d封装成私钥

加密解密

使用公钥(n,e)对m进行加密,m必须是整数(字符串可以取ASCII值或者Unicode值)且小于n。
me=c(moden) m^e = c (mode\:n)
使用私钥(n,d)对c进行解密:
cd=m(modn) c^d = m (mod\:n)

DH算法

DH算法计算**步骤:

  1. Alice和Bob先对p和g达成一致并且公开出来。

  2. Alice取一个私密整数a,将下列公式产生的计算结果A发给Bob。
    A=gamodp A = g^a\:mod\:p

  3. 类似的,Bob也取一个私密整数b,将下列公式产生的计算结果B发送给Alice。
    B=gbmodp B = g^b\:mod\:p

  4. Alice根据以下公式计算出对称**S:
    S=Bamodp=(gb)amodp=gabmodp S = B^a\:mod\:p = (g^b)^a\:mod\:p = g^{ab}\:mod\:p

  5. Bob通过以下公式计算出对称**S
    S=Abmodp=(ga)bmodp=gabmodp S = A^b\:mod\:p = (g^a)^b\:mod\:p = g^{ab}\:mod\:p

数字签名和数字证书

数字签名用来验证信息的完整性和准确性

  1. 服务器端将发送给客户端的信息进行hash,生成摘要(digest),然后用自己的私钥对摘要进行加密,生成数字签名(signature),然后将signature附在要发送的信息下面一起发送给客户端。
  2. 客户端接收到服务器发送来的信息后,使用服务器的公钥对数字签名进行解密。
  3. 客户端对服务器端发送的信息进行hash,然后将结果与数字签名解密后的结果进行对比,若一致,则说明信息没有被篡改,否则被篡改。

以下中间人攻击的介绍来自*。

中间人攻击是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。在许多情况下这是很简单的(例如,在一个未加密的Wi-Fi 无线接入点的接受范围内的中间人攻击者,可以将自己作为一个中间人插入这个网络)。

一个中间人攻击能成功的前提条件是攻击者能将自己伪装成每一个参与会话的终端,并且不被其他终端识破。中间人攻击是一个(缺乏)相互认证的攻击。大多数的加密协议都专门加入了一些特殊的认证方法以阻止中间人攻击。例如,SSL协议可以验证参与通讯的一方或双方使用的证书是否是由权威的受信任的数字证书认证机构颁发,并且能执行双向身份认证。

数字证书用来验证公开**的正确性。

  1. 服务器将自己的公开**登录至数字证书认证机构
  2. 数字证书认证机构用自己的私有**向服务器的公开密码署数字签名并颁发公钥证书
  3. 客户端拿到服务器的公钥证书后,用数字证书认证机构的公开**向数字证书认证机构验证公钥证书上的数字签名,以确认服务器的公开**的真实性
  4. 使用服务器的公开**对报文加密后发送
  5. 服务器用私有**对报文解密

HTTPS通信

计算机网络——HTTPS协议

  1. 客户端通过发送ClientHello报文开始SSL通信。报文包含客户端支持的SSL的指定版本、加密组件列表(所使用的加密算法以及**长度等)。
  2. 服务器可以进行SSL通信时,会以ServerHello报文作为应答。在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接受到的客户端加密组件中筛选出来的。
  3. 之后服务器发送Certificate报文,报文中包含公开**证书
  4. 最火服务器发送ServerHelloDone报文通知客户端,最初阶段的SSL握手协商部分结束。
  5. SSL第一次握手之后,客户端以ClientKeyExchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已经通过步骤三中的公开**进行加密。
  6. 客户端继续发送ChangeCipherSpec报文,该报文会提示服务器,在此报文之后的通信会采用Pre-master secret**加密。
  7. 客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商以服务器是否能够正确解密该报文作为评判标准
  8. 服务器同样发送ChangeCipherSpec报文
  9. 服务器同样发送Finished报文
  10. 服务器和客户端的Finished报文交换完毕之后,SSL连接建立完成。通信会受到SSL的保护,从此处开始发送HTTP请求
  11. 应用层协议通信,即发送HTTP请求
  12. 最后由客户端断开连接。断开连接时发送close_notify报文。
  13. 发送TCP FIN报文来关闭与TCP的通信。

总结来说,可以分为以下五部分:

  • 客户端给出协议版本号、一个客户端生成的随机数(client random),以及客户端支持的加密算法
  • 服务器端确认双方使用的加密算法,并给出数字证书、以及一个服务器生成的随机数(server random)
  • 客户端确认数字证书有效,然后生成一个新的随机数(premaster secret),并使用数字证书中的公钥加密这个随机数,然后发送给服务器端
  • 双方根据约定的加密算法,使用三个随机数生成对话**(session key),用来加密整个会话过程。

一次Wireshark的抓包分析

通过wireshark的一次抓包分析来看,只说TLS的包的交互和内容:

  1. 首先,客户端会向服务端发送一个Client Hello包,内容包含有一个随机数Random(即上面说的p),一个TLS协议版本号Version,一组加密协议Cipher Suites。
  2. 然后,服务器端会向客户端发送一个Server Hello包,内容包含一个随机数Random(即上面说的q),一个TLS协议版本号Version,一个确定的加密协议Cipher Suite。
  3. 接着,服务器还会发送一个数据包,包含两层TLS数据包:一层证书包Certificate,另一层包含一个Server Key Exchange和一个Server Hello Done包。Certificate包包含服务器端的证书;Server Key Exchange中包含有DH算法传递的参数,如服务器端的Pubkey(即上面说的B)和签名Signature。
  4. 随后,客户端会向服务器端发送一个TLS包,该包中分为三部分:Client Key Exchange、Change Cipher Spec和Encrypted Handshake Message。Client Key Exchange中主要包含DH算法传递的参数Pubkey(即上面说的A)。
  5. 服务器端会向客户端发送一个TLS包,该包中的内容可以分为三部分:New Session Ticket、Change Cipher Spec和Encrypted Handshake Message。New Session Ticket中主要包含了一个Session Ticket。

Session的恢复

握手阶段用来建立SSL连接。若处于某种原因而导致会话中断,就需要重新进行握手。

此时有两种方式恢复原来的session:session ID和session ticket

session ID是说每次对话都有一个session ID。若对话中断,下次重连的时候,客户端只需给出session ID,且服务器端有此session ID的记录,双方就可以重新使用已有的对话**,而不需重新生成一把。

session ID是目前浏览器都支持的方法,但是往往只保留在一台服务器上,因此若请求发送至另一台服务器的话,就无法恢复会话。session ticket就是为了解决这个问题的。

session ticket中,客户端发送的不再是session ID,而是session ticket。session ticket是加密的,只有服务器才能解密,其中包括本次对话的主要信息,比如对话**和加密方法。当服务器收到session ticket后,解密后就不必重新生成对话**了。

参考资料

阮一峰的工作日志——HTTPS部分内容

*

图解HTTP

Wireshark抓包工具