https

人这一生要经历很多事情,越过众多山丘,其中有些事情是冥冥之中注定了的,逃脱不得。
比如:如果你是一名前端工程师,HTTPS 的掌握就是你成长路上必须征服的一座山。


什么是 HTTPS ?

HTTPS 是最常见的 HTTP 安全版本。它是由网景公司首创的,所有主要的浏览器和服务器
都支持此协议。HTTPS 将 HTTP 协议与一组强大的对称、非对称和基于证书的加密技术结
合在一起,使得 HTTPS 不仅很安全,而且很灵活,很容易在处于无序状态的、分散的全球
互联网上进行管理。

HTTPS 方案的 URL 以 https:// 开头,据此就可以分辨某个 Web 页面是通过 HTTPS
还是 HTTP 访问的(有些浏览器还会显示一些标志性的安全提示)。

使用 HTTPS 时,所有的 HTTP 请求和响应数据在发送到网络之前,都要进行加密。
HTTPS 在 HTTP 下面提供了一个传输级的密码安全层—可以使用SSL(Secure Sockets Layer,
安全套接层协议),也可以使用其后继者TLS(Transport Layer Security,传输层安全协议)。
SSL 和 TLS 是非常类似的。

HTTPS 是位于安全层之上的 HTTP,这个安全层位于 TCP 之上。如下图所示:

HTTP HTTPS
应用层 HTTP HTTP
安全层 SSL or TLS
传输层 TCP TCP
网络层 IP IP
数据链路层 网络接口 网络接口

大部分困难的编码以及解码工作都是在 SSL 库中完成的,所以 Web 客户端和服务器在使用
安全 HTTP 时无需过多的修改器协议处理逻辑。在大多数情况下,只需要用 SSL 的输入/输出
调用取代 TCP 的调用,再增加其他几个调用来配置和管理安全信息就行了。

为什么需要 HTTPS ?

简而言之,使用 HTTPS 就是为了安全,Web 需要一种安全的 HTTP 形式。

详细点儿说呢?可以说的理由简直不要太多:
人们会利用 Web 事务来处理一些很重要的事情。如果没有强有力的安全保证,
人们就无法安心地进行网络购物或者使用银行业务。如果无法严格限制访问权限,
公司就不能将重要的文档放在 Web 服务器上······


数字加密

既然涉及到安全,就会涉及到加密和解密。在继续深入了解 HTTPS 之前,需要知道一些加密编码的知识。

密码学

密码学是对报文进行编/解码的机制与技巧。

应用密码学知识可以做到:

  • 加密报文,防止好事者读取报文
  • 防止某些人对报文进行篡改
  • 证明某条报文或某个事务确实出自某处

密码

密码学基于一种名为密码(cipher)的秘密代码。密码是一套编码方案—一种特殊的报文编码方式和一种
编码后使用的相应解码方式的结合体。

加密之前的原始报文通常被称为明文(plaintext 或 cleartext),
使用了密码之后的编码报文通常被称作密文(ciphertext)。

明文 —> 编码器 —> 密文 —> 解码器 —> 明文

密码机

最初,人们需要自己进行编码和解码,所以起初密码是相当简单的算法。因为密码很简单,所以人们通过纸笔和
密码书就可以进行编解码了,但聪明人可以相当容易地破解这些密码。

随着技术的进步,人们开始制造一些机器,这些机器可以用复杂得多的密码来快速、精准地对报文进行编解码。

秘钥

编码算法和编码机都可能会落入敌人手中,所以大部分机器上都有一些号盘,可以将其设置为大量不同的值以改变
密码的工作方式。即使机器被盗,没有正确的号盘设置(密钥值),解码器也无法工作。

这些密码参数被称为秘钥(key)。要在密码机中输入正确的密钥,解密过程才能正确进行。密码秘钥会让一个密码机
看起来好像是多个虚拟密码机一样,每个密码机有不同的密钥值,因此其行为都会有所不同。

数字密钥

随着数字计算的出现,出现了数字密钥。与金属钥匙或机械设备中的号盘设置相比,数字密钥只是一些数字。
这些数字密钥值是编/解码算法的输入。编码算法就是一些函数,这些函数会读取一块数据,并根据算法和
密钥值对其进行编/解码。

假定报文为 P,编码函数为 E, 一个编码密钥为 e,经过编码的密文为 C,则上述关系可以用表达式描述为:

C = E(P, e)

对称密钥(symmetric-key)加密技术

在编码时和解码时使用相同的密钥的技术,被称为对称密钥加密技术。

在对称密钥加密技术中,发送端和接收端要共享相同的密钥才能进行通信。发送端用共享的密钥来加密报文,
并将得到的密文发送给接收端。接收端收到密文,并对其应用解密函数和相同的共享密钥,恢复出原始的明文。

流行的对称密钥加密算法包括:DES、Triple-DES、RC2 和 RC4。

在很多情况下,编/解码算法都是众所周知的,因此密钥就是唯一保密的东西了。

枚举攻击

好的加密算法会迫使攻击者试遍每一个可能的密钥,才能破解代码。

暴力的去尝试所有的密钥值的方式被称为枚举攻击(enumeration attack)。

缺点

对称密钥加密技术的缺点之一就是发送者和接受者在互相对话之前,一定要有一个共享的保密密钥。

如果有 N 个节点,每个节点都要和其他所有 N-1 个节点进行安全对话,总共大概会有 N² 个保密密钥,
这将是一个管理噩梦。


公开密钥加密技术

公开密钥加密技术没有为每对主机使用单独的加密/解密密钥,而是使用了两个非对称密钥:一个用来对
主机报文编码,另一个用来对主机报文解码。编码密钥是众所周知的(这也是公开密钥加密的由来),但
只有主机才知道私有的解密密钥。这样,每个人都能找到某个特定主机的公开密钥,密钥的建立变得更加简单。
但解码密钥是保密的,因此只有接收端才能对发送给它的报文进行解码。

RSA

RSA 算法是一个流行的公开密钥加密系统,它是在 MIT 发明的,后来由 RSA 数据安全公司将其商业化。
即使有了公钥、任意一段明文、用公钥对明文编码之后得到的相关密文、RSA 算法自身,甚至 RSA 实现的
源代码,破解难度就很大。这个困难被认为是所有计算机科学中最难的问题之一。

混合加密系统和会话密钥

公开密钥技术的一个问题是加密算法的计算可能会很慢。实际上它混合使用了对称和非对称策略。

比较常见的做法是:在两个节点间通过便捷的公开密钥加密技术建立起安全通信,然后再用那条安全的通道产生
并发送临时的随机对称密钥,通过更快的对称加密技术对其余的数据进行加密。

存在问题

接收方不能确认收到的公开密钥是预期的发送方发行的公开密钥,也许在公开密钥传输过程中就已经被替换掉了。

使用数字证书可以解决这个问题。

数字签名(digital signing)

除了加/解密报文之外,还可以用加密系统对报文进行签名(sign),以说明是谁编写的报文,同时证明报文
未被篡改过。这种技术被称为数字签名。

数字签名是附加在报文上的特殊加密校验码,通常是用分对称公开密钥产生的。

节点 A 给节点 B 发送一条报文,进行签名的过程通常如下:

  1. 节点 A 将 边长报文 提取为 定长摘要。
  2. 节点 A 对摘要应用一个“签名”函数,这个函数会将节点 A 的私有密钥作为参数。
    因为只有节点 A 才知道私有密钥,所以正确的签名会说明签名者就是其所有者。
  3. 一旦计算出签名,节点 A 就将其附加在报文的末尾,并将报文和签名都发送给 B。
  4. 在接收端,如果节点 B 需要确定报文确实是节点 A 写的,而且没有被篡改过,节点 B 可以对签名进行检查。
    节点 B 接收经私有密钥扰码的签名,并应用了 使用公开密钥的 反函数。
    如果拆包后的摘要与节点 B 自己的摘要版本不匹配,要么就是报文在传输过程被篡改了,
    要么就是发送端没有节点 A 的私有密钥(也就是说发送端不是节点 A)

数字证书

数字证书(certs)中包含了由某个受信任组织担保的用户或公司的相关信息。

证书的主要内容

基本的数字证书通常包含一些纸质 ID 中常见的内容,比如:

  • 对象的名称(人、服务器、组织等)
  • 过期时间
  • 证书发布者
  • 来自证书发布者的数字签名

此外,数字证书通常还包括对象的公开密钥,以及对象和所用签名算法的描述性信息。

X.509 v3证书

数字证书没有单一的全球标准,但是目前使用的大多数证书都以一种标准格式(X.509 v3)来存储信息。

X.509 证书字段表

字段 描述
版本 这个证书的 X.509 证书版本号。现在通常都是版本3
序列号 证书颁发机构(CA)生成的唯一整数。CA生成的每个证书都要有一个唯一的序列号
签名算法ID 签名所使用的加密算法。例如:“用 RSA 加密的 MD2 摘要”
证书颁发者 发布并签署这个证书的组织名称,以 X.500 格式表示
有效期 此证书合适有效,由一个初始日期和一个结束日期来表示
对象名称 证书中描述的实体,比如一个人活一个组织。对象名称是以 X.500 格式表示的
对象的公开密钥信息 证书对象的公开密钥,公开密钥使用的算法,以及所有附加参数
发布者唯一的 ID (可选) 证书发布者唯一标识符
对象唯一的 ID (可选) 证书对象唯一标识符

基于 X.509 证书的签名有好几种,包括:Web 服务器证书、客户端电子邮件证书、软件代码签名证书和证书颁发机构证书。

用证书对服务器进行认证

通过 HTTPS 建立了一个安全 Web 事务之后,现代的浏览器都会自动获取所连接服务器的数字证书。
如果服务器没有证书,安全链接就会失败。

服务器证书中包含很多字段,其中包括:

  • Web 站点的名称和主机名
  • Web 站点的公开密钥
  • 签名颁发机构的名称
  • 来自签名颁发机构的签名

HTTP 和 HTTPS 区别和优劣


参考

志遥 wechat
微信扫一扫,我在丁香园记公众号等你