HTTPS 学习

为什么需要 HTTPS?

HTTP1.1 有以下安全性问题:

  1. 使用明文(不加密)进行通信,内容可能会被窃听;
  2. 不验证通信方的身份,通信方的身份有可能遭遇伪装;
    • 服务器无法验证请求来自谁,是否是合法的客户端。
    • 客户端收到响应,也无法验证是否是来自合法的服务器。
    • 无法阻止海量请求下的 Dos 拒绝攻击(Denial of Service,拒绝服务攻击)
  3. 无法证明报文的完整性,报文有可能遭篡改。
    • 客户端和服务端面对收到的响应和请求,都只能无条件接受,HTTP 也无法知道请求或响应在传输过程中是否已经被篡改了,例如遭到了中间人攻击(Man-in-the-Middle attack,MITM)。
    • HTTP 也有可以验证报文完整性的方法,但是还是不可靠。比如利用 MD5 和 SHA-1 等散列值校验的方法,用来确认文件的数字签名。

HTTPS 如何保证安全?

HTTPS 在传输层增加了一层 SSL(Secure Sockets Layer 安全套接层)/ TLS (Transport Layer Security 安全层传输协议) 来加密 HTTP 的通信内容。

通过使用 SSL,HTTPS 不仅能保证密文传输,重要的是还可以做到验证通信方的身份,保证报文的完整性。完美的解决了 HTTP 在安全性上的三大缺陷。

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

加密

HTTPS 同时采用对称加密和非对称加密的机制保证安全传输:

  1. 对称密钥加密(Symmetric-Key Encryption),加密的加密和解密使用同一密钥。

    Untitled

  2. 公开密钥加密(Public-Key Encryption),也称为非对称密钥加密,使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。

    Untitled

具体来说 HTTPS 使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中的 Session Key 就是对称密钥)

Untitled

认证

HTTPS 通过使用 证书 来对通信方进行认证。

数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一起。

进行 HTTPS 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,先进行验证,如果验证通过,就可以开始通信。

Untitled

使用 OpenSSL 开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。

完整性

TLS / SSL 提供报文摘要功能来验证完整性。

常见的完整性校验方式是通过摘要算法(如散列函数、哈希函数等)把数据压缩成为一个 Hash 码,无法逆推,也很难找到两个不同的信息其hash结果是相同的。然后发送方把信息和 Hash 码一起发送,接收方根据信息重新计算 Hash 码进行对比。

但光有摘要算法还不足以保证数据的完整性,因为可能是信息整体包括 Hash 的计算值都被替换了。在TLS协议中,有一个称为MAC(Message Authentication Code)的机制用于确保数据的完整性。MAC是基于密钥的哈希函数,它使用密钥和数据生成一个固定长度的校验值。发送方在发送数据之前,会使用密钥计算MAC,并将其与数据一起发送。接收方使用相同的密钥计算接收到数据的MAC,并与发送方发送的MAC进行比对。如果两者匹配,就说明数据未被篡改。

所以,这里的完整性需要的前提是,通信双方拥有共同的密钥,才可以进行通信,也即完整性依赖于前面的加密才得以实现。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top