计算机网络——HTTPS协议 - Go语言中文社区

计算机网络——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/TLS协议是一种向后兼容的协议

加密技术

对称密钥加密

SSL采用公开密钥加密的加密处理方式。即加密算法公开,密钥保密。客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文之后,用自己的私钥解密。

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

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

非对称密钥加密

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

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

公开密钥加密的问题

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

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

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

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

在实际中,一般都是利用公钥加密给对方发送一个密钥,之后用此密钥作为对称加密的密钥进行通信。

这样既利用了公钥加密可以公开加密的特点,又利用了对称加密速度快的特点。

RSA算法

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

RSA算法分为公钥加密算法和签名算法。

几个数学概念

互质

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

构成互质关系的情况:

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

欧拉函数

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

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

  • 若n和e互质,则

a φ ( n ) = 1 ( m o d   n ) a^{φ(n)} = 1(mod:n) aφ(n)=1(modn)

模反函数

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

RSA加密算法

RSA加密算法是用公钥对数据进行加密,私钥用于对数据解密。

密钥的生成步骤

密钥的生成步骤

  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。
c = m e   m o d   n c = m^e:mod:n c=memodn

解密

使用私钥(n,d)对c进行解密:
m = c d   m o d   n ; c d = m e d = m   m o d   n m = c^d:mod:n;c^d = m^{ed} = m:mod:n m=cdmodncd=med=mmodn

RSA签名算法

签名算法中用私钥对数据进行签名,公钥对签名进行验证

密钥的生成步骤

签名算法的密钥生成步骤和加密算法的生成步骤一样。

加密

使用私钥对m进行签名σ。
σ = m d   m o d   n σ = m^d:mod:n σ=mdmodn

解密

通过以下公式计算m‘,然后与m进行对比,若相等,则验证通过,否则,验证失败。
m ′ = σ e   m o d   n m' = σ^e:mod:n m=σemodn

DH算法

DH算法是说通信双方都采用一个公开信道传递消息,但只有彼此才能够分享一个相同的密钥S,其他人即使获取到了公开信道中的任何消息,都无法计算出密钥S。

DH算法计算密钥步骤:

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

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

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

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

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

  6. 可以发现两人得出的对称密钥S是一样的。

数字签名和数字证书

签名作用:用来验证信息的完整性和准确性

**签名原理:Hash算法不可逆。**Hash算法是一种多对一映射。Hash算法将一段任意长度的值生成一段固定长度的值。

签名流程:

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

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

证书包含:申请者公钥、申请者的组织信息和个人信息、签发机构CA信息、有效时间、证书序列号等信息的明文,同时包含一个数字签名。

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

如果数字证书被伪造了,那么可以一致请求给当前CA做保证的上一级CA,这样一直递归查询,直到找到一个根CA机构。根CA机构的公钥一般直接写入到操作系统的底层中,以保证可靠性。

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的一次抓包分析来看,基于TLS1.2:

  1. 首先,客户端会向服务端发送一个Client Hello包,内容包含有一个随机数Random(即上面说的p),一个TLS协议版本号Version,,一个Session ID,一组加密协议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 ExchangeChange Cipher SpecEncrypted 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抓包工具

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yjh728/article/details/102733146
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢