HTTPS相关

前一段儿时间去美团外卖组面试, 被问到HTTPS相关的问题, 回答的不是很好, 想着整理一下.

部分摘取自 <<图解HTTP>>

未加密HTTP存在的问题

  1. 通信使用明文, 内容可能被窃听.
  2. 无法证明报文完整性, 内容可能被篡改.
  3. 不验证通信方的身份, 可能遭遇伪装.

加密HTTP的手段

  1. 使用基于SSL(Secure Socket Layer, 安全套接层)或TLS(Transport Layer Security, 安全层传输协议)的HTTPS.

    HTTPS是业界的标准加密做法.

  2. 对内容加密.

    要求客户端和服务端同时具备加密与解密的机制, 但是内容仍有被篡改的风险.

TLS是以SSL为原型开发的, 可以统称为SSL. 目前主流版本分别是SSL3.0, TLS1.0.

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

通常, HTTP直接和TCP通信. 当使用SSL时, 则演变成先和SSL通信, 再由SSL和TCP通信. 即由HTTP->TCP->IP演变为HTTP->SSL->TCP->IP.

两种加密方式:

  1. 共享(对称)密钥加密.

    加密解密使用相同的密钥, 面临的困境是: 密钥安全地转交以及保管.

  2. 公开(非对称)密钥加密.

    解决了共享密钥加密的密钥转交问题.

    使用一对密钥进行加密. 一把叫私有密钥, 一把为公开密钥.加密方式: 发送方使用对方的公钥加密, 对方收到加密的信息后, 再使用自己的私钥进行解密.

    根据密文与公钥解密原文是很困难的, 相当于对离散对数求值.

HTTPS使用混合加密机制:

公开密钥加密与共享密钥加密相比, 其处理速度要慢. 故可以充分利用两者的优势: 使用公开密钥加密方式交换共享密钥, 之后则使用共享密钥加密要传输的信息.

如何证明公钥的正确性–证书:

可以使用数字证书认证机构(CA, Certificate Authority)颁发的公钥证书.业务流程:

  1. 服务器维护者向CA提出公钥申请.
  2. CA判明申请者的身份, 对公钥做数字签名, 把公钥绑定到公钥证书.
  3. 服务器将这个CA颁发的公钥证书发送给客户端.
  4. 客户端对证书的数字签名进行验证. 验证通过则说明: CA的有效性, 服务器的公钥可信赖.
  5. 客户端使用公钥加密发送给服务端.
  6. 服务端使用私钥解密报文.

多数的开发商会事先在浏览器内部植入常用的CA的公开密钥, 以避免公钥的转交问题.

关于HTTPS的建立过程



  1. 客户端首先会将自己支持的加密算法,打个包告诉服务器端。
  2. 服务器端从客户端发来的加密算法中,选出一组加密算法和HASH算法(注,HASH也属于加密),并将自己的身份信息以证书的形式发回给客户端。而证书中包含了网站的地址,加密用的公钥,以及证书的颁发机构等;

    这里有提到公钥的概念是故事中没有的。我们常见的加密算法一般是一些对称的算法,如凯撒加密;对称算法即加密用的密钥和解密用的密钥是一个。如故事中的密钥是4。还有一种加密解密算法称之为非对称算法。这种算法加密用的密钥(公钥)和解密用的密钥(私钥)是两个不同的密钥;通过公钥加密的内容一定要使用私钥才能够解密。

    这里,服务器就将自己用来加密用的公钥一同发还给客户端,而私钥则服务器保存着,用户解密客户端加密过后的内容。

  3. 客户端收到了服务器发来的数据包后,会做这么几件事情:

    • 验证一下证书是否合法。一般来说,证书是用来标示一个站点是否合法的标志。如果说该证书由权威的第三方颁发和签名的,则说明证书合法。
    • 如果证书合法,或者客户端接受和信任了不合法的证书,则客户端就会随机产生一串序列号,使用服务器发来的公钥进行加密。这时候,一条返回的消息就基本就绪。
    • 最后使用服务器挑选的HASH算法,将刚才的消息使用刚才的随机数进行加密,生成相应的消息校验值,与刚才的消息一同发还给服务器。
  4. 服务器接受到客户端发来的消息后,会做这么几件事情:

    • 使用私钥解密上面第2)中公钥加密的消息,得到客户端产生的随机序列号。
    • 使用该随机序列号,对该消息进行加密,验证的到的校验值是否与客户端发来的一致。如果一致则说明消息未被篡改,可以信任。
    • 最后,使用该随机序列号,加上之前第2步中选择的加密算法,加密一段握手消息,发还给客户端。同时HASH值也带上。
  5. 客户端收到服务器端的消息后,接着做这么几件事情:

    • 计算HASH值是否与发回的消息一致
    • 检查消息是否为握手消息
  6. 握手结束后,客户端和服务器端使用握手阶段产生的随机数以及挑选出来的算法进行对称加解密的传输。

CBC模式的加密方法为: 将前一个明文块加密后XOR下一个明文块, 然后再对结果加密. 第一个块则需要特殊生成(上图中的初始向量).

协商决定加密组件相当于沟通选择彼此支持的加密算法.

HTTPS存在的问题

  1. 通信慢. 除去了TCP连接与HTTP请求/响应外, 还需要进行SSL通信.
  2. 客户端与服务端都需要进行加密/解密的处理运算, 占用CPU与内存资源.
  3. 证书成本.

处理办法: 只针对与敏感操作使用HTTPS加密.