计网-HTTPS

本文最后更新于:14 天前

什么是HTTPS?

HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer): 一般理解为 HTTP+SSL/TLS = HTTPS,通过 SSL 证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密

SSL:Secure Socket Layer,安全套接字层

TLS(Transport Layer Security,传输层安全): 其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0) 由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本.SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到.TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是 TLS 1.1、TLS 1.2

浏览器在使用 HTTPS 传输数据的流程是什么? (六点)

  1. 首先客户端通过 URL 访问服务器建立 SSL 连接,客户端会将生成一个随机数(client random),以及客户端支持的加密方法发送给服务端

  2. 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含服务端的公钥)还有一个随机数(server random)传送一份给客户端

  3. 客户端的服务器开始协商 SSL 连接的安全等级,也就是信息加密的等级

  4. 客户端的浏览器根据双方同意的安全等级,生新成一个随机数(Premaster secret),然后利用服务端的公钥将生成的新随机数加密,并传送给服务端

  5. 服务器利用自己的私钥解密得到新随机数(Premaster secret),用(client random,server random,Premaster secret)生成对话密钥(session key)

  6. 服务器利用会话密钥加密与客户端之间的通信

为什么要用https? (三点)

  1. 参数明文传输,不安全

  2. 数据的完整性未校验,容易被篡改

  3. 没有验证对方身份,存在冒充危险

HTTPS 的缺点?(三点)

  1. HTTPS 协议多次握手,导致页面的加载时间延长近50%

  2. HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗

  3. SSL 涉及到的安全算法会消耗 CPU 资源,对服务器资源消耗较大

HTTPS 和 HTTP 的区别?(三点)

  1. HTTPS 是 HTTP 协议的安全版本,HTTP 协议的数据传输是明文的,是不安全的,HTTPS 使用了 SSL/TLS 协议进行了加密处理

  2. HTTP 和 HTTPS 使用连接方式不同,默认端口也不一样,HTTP 是80,HTTPS 是443

  3. HTTP 属于应用层, HTTPS 由于加了 SSL,是应用层和传输层的结合

对称加密和非对称加密?

加密和解密同用一个密钥的方式称为共享密钥加密,也被叫做对称密钥加密

共享加密方式加密时必须将密钥也发给对方

在互联网上转发密钥时,如果通信被监听那么密钥就会落入攻击者之手,同时也就失去了加密的意义

公开密钥加密方式很好地解决了共享密钥加密的困难:

公开密钥加密使用一对非对称的密钥:一把叫做私有密钥,另一把叫做公开密钥

使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密

利用这种方式,不需要发送用来解密的私有密钥,也不用担心密钥被攻击者窃听而盗走

HTTPS采用共享秘钥加密和公开秘钥加密两者并用的混合加密机制

若密钥能够实现安全交换,那么有可能会考虑仅适用公开密钥加密来通信

但是公开密钥加密和共享密钥加密相比,处理速度要慢

公开密钥加密方式还是存在一些问题的,那就是无法证明公开密钥本身就是货真价实的公开密钥

例如当服务器发送公钥时被截取,然后替换了公钥,那么就会出现问题,所以解决办法是:数字证书认证机构 CA 颁发的公开密钥证书 [1]

为什么 HTTPS 要同时使用对称加密和非对称加密两种加密方式的混合模式?

因为对称加密速度比较快,但是对称加密无法保证加密密钥的安全传输,所以使用非对称密钥来将生成的对称密钥安全传输到双方,此后使用更快的对称加密密钥。

为什么对称加密速度比较快?

对称加密主要的运算是位运算,速度是非常快的,例如 DES 算法(置换,位移,异或,迭代)。如果使用硬件速度会更快。

非对称加密计算一般都比较复杂,例如 RSA,它里面涉及到大数乘法、大数取模运算等等。

而幂运算的本质是乘法,乘法的基础单位是加法,也就是我们最常见的整数加。而在电路上实现加法比异或(XOR)要麻烦的多,况且后面还有一个模运算。因此非对称加密的速度自然而然是比不过对称加密的。

另外还有一个原因是,某些对称加密算法,例如 DES 算法中有些模式,如 ECB 模式等等,中间计算过程是可以并行计算的,更进一步提高加密解密的速度。

如何保证 server 的公钥传到客户端时不被篡改呢?

答: 1. 可信的第三方 CA 机构 2. 非对称加密

HTTPS 中 RSA 非对称加密的两种模式:

  1. 加密模式,保证数据传输方的数据安全性(不可被其他人读)

    加密模式:私钥解密,公钥加密

  2. 认证模式,保证数据接受方的数据完整性(不可被其他人篡改)

    认证模式: 私钥签名(加密),公钥认证(解密)

CA 机构使用 CA 自己的私钥对 server 的公钥和 server 的一些信息统一加密/签名是,生成数字证书.

当 client 请求 server 时,server 将信息正文,有信息正文生成的数字签名[2]和数字证书[1:1]一起发送给 client.

这样,client 在接收时会根据浏览器内置的受信任的 CA 机构列表判断发来的签发证书的机构是否有效,如果有效,那么使用对应 CA 机构内置的 CA 的公钥解密/认证 CA 发送的证书,从中得到 server 的公钥,并且,使用 server 的公钥解密/认证数字签名,如果得到的结果和信息正文散列后的摘要一致,那么说明 server 的公钥是安全的,且信息正文没有被篡改.

因为,1. 如果 server 向 client 发送的信息中,server 的公钥被恶意第三方篡改,但是第三方无法拿到 CA 的私钥对数字证书重新加密认证;2. 而如果使用第三方自己的私钥加密认证,client 会提示这是不受信任的机构;3. 如果是只修改了信息正文,那么数字签名会不对应;4. 如果修改了信息正文并想重新生成对应的数字签名也是不可能的,因为加密摘要要使用 server 的私钥,第三方拿不到

  • 如果只是 server 自己签发数字签名和公钥以及信息正文,没有第三方 CA 机构:

    server 的公钥散列生成摘要,并使用自己的公钥对公钥和 server 的一些信息统一加密/认证,生成数字证书发送给 client

    但是中途还是有可能被第三方拦截,如果替换了 server 公钥还是无法察觉

  • 如果只是颁发数字证书,没有数字签名,信息正文可能会被篡改


  1. 数字证书: 信任的 CA 机构颁发,证书 = CA 使用自己的 CA 私钥加密/认证 server 的公钥以及一些 server 的其他信息后的结果 ↩︎ ↩︎

  2. 数字签名: 将信息散列[3]生成摘要[4],并使用自己的私钥对摘要加密,即生成数字签名 ↩︎

  3. 散列: 散列不同于加密,散列即不可逆 ↩︎

  4. 例如使用 MD5 算法将一个原值生成散列值,而这个散列值不可反推回原来的值 ↩︎