人这一生要经历很多事情,越过众多山丘,其中有些事情是冥冥之中注定了的,逃脱不得。
比如:如果你是一名前端工程师,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 发送一条报文,进行签名的过程通常如下:
- 节点 A 将 边长报文 提取为 定长摘要。
- 节点 A 对摘要应用一个“签名”函数,这个函数会将节点 A 的私有密钥作为参数。
因为只有节点 A 才知道私有密钥,所以正确的签名会说明签名者就是其所有者。 - 一旦计算出签名,节点 A 就将其附加在报文的末尾,并将报文和签名都发送给 B。
- 在接收端,如果节点 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 站点的公开密钥
- 签名颁发机构的名称
- 来自签名颁发机构的签名