概述

HTTPS(HTTP Secure)是一种构建在 SSL 或 TLS 上的HTTP协议。

简单的说,HTTPS 就是 HTTP 的安全版本。SSL(Secure Sockets Layer)以及继任者 TLS(Transport Layer Security)是一种安全协议,为网络通信提供来源认证、数据加密和报文完整性检测,保障通信的保密性和可靠性。HTTPS协议的 URL 都以 “https://”开头,在访问某个 Web 页面时,客户端会打开一条到服务器 443 端口的连接。

HTTP和HTTPS
HTTP和HTTPS

之所以说HTTP不安全,是由于以下3个原因导致的:

  1. 数据以明文传递,有被窃听的风险
  2. 接收到的报文无法证明是发送时的报文,不能保障完整性,因此报文有被篡改的风险
  3. 不验证通信两端的身份,请求或响应有被伪造的风险
HTTP的风险
HTTP的风险

当初设计 HTTPS 是为了满足哪些需求?

很多介绍 HTTPS 的文章一上来就给你讲实现细节。个人觉得:这是不好的做法。一上来就给你讲协议细节,你充其量只能知道 WHAT 和 HOW,无法理解 WHY。

兼容性

因为是先有 HTTP 再有 HTTPS。所以,HTTPS 的设计者肯定要考虑到对原有 HTTP 的兼容性。这里所说的兼容性包括很多方面。比如已有的 Web 应用要尽可能无缝地迁移到 HTTPS;比如对浏览器厂商而言,改动要尽可能小。

基于“兼容性”方面的考虑,很容易得出如下几个结论:

  1. HTTPS 还是要基于 TCP 来传输(如果改为 UDP 作传输层,无论是 Web 服务端还是浏览器客户端,都要大改,动静太大了)
  2. 单独使用一个新的协议,把 HTTP 协议包裹起来(所谓的“HTTP over SSL”,实际上是在原有的 HTTP 数据外面加了一层 SSL 的封装。HTTP 协议原有的 GET、POST 之类的机制,基本上原封不动)

打个比方:如果原来的 HTTP 是塑料水管,容易被戳破;那么如今新设计的 HTTPS 就像是在原有的塑料水管之外,再包一层金属水管。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。

可扩展性

前面说了,HTTPS 相当于是“HTTP over SSL”。如果 SSL 这个协议在“可扩展性”方面的设计足够牛逼,那么它除了能跟 HTTP 搭配,还能够跟其它的应用层协议搭配。岂不美哉?

现在看来,当初设计 SSL 的人确实比较牛。如今的 SSL/TLS 可以跟很多常用的应用层协议(比如:FTP、SMTP、POP、Telnet)搭配,来强化这些应用层协议的安全性。

接着刚才打的比方:如果把 SSL/TLS 视作一根用来加固的金属管,它不仅可以用来加固输水的管道,还可以用来加固输煤气的管道。

保密性(防泄密)

HTTPS 需要做到足够好的保密性。说到保密性,首先要能够对抗嗅探(行话叫 Sniffer)。所谓的“嗅探”,通俗而言就是监视你的网络传输流量。如果你使用明文的 HTTP 上网,那么监视者通过嗅探,就知道你在访问哪些网站的哪些页面。

嗅探是最低级的攻击手法。除了嗅探,HTTPS 还需要能对抗其它一些稍微高级的攻击手法——比如“重放攻击”。

完整性(防篡改)

除了“保密性”,还有一个同样重要的目标是“确保完整性”。在发明 HTTPS 之前,由于 HTTP 是明文的,不但容易被嗅探,还容易被篡改。比如咱们天朝的网络运营商(ISP)都比较流氓,经常有网友抱怨说访问某网站(本来是没有广告的),竟然会跳出很多中国电信的广告。为啥会这样捏?因为你的网络流量需要经过 ISP 的线路才能到达公网。如果你使用的是明文的 HTTP,ISP 很容易就可以在你访问的页面中植入广告。

所以,当初设计 HTTPS 的时候,还有一个需求是“确保 HTTP 协议的内容不被篡改”。

真实性(防假冒)

在谈到 HTTPS 的需求时,“真实性”经常被忽略。其实“真实性”的重要程度不亚于前面的“保密性”和“完整性”。你因为使用网银,需要访问该网银的 Web 站点。那么,你如何确保你访问的网站确实是你想访问的网站?(这话有点绕口令)

有些天真的同学会说:通过看网址里面的域名,来确保。为啥说这样的同学是“天真的”?因为 DNS 系统本身是不可靠的(尤其是在设计 SSL 的那个年代,连 DNSSEC 都还没发明)。由于 DNS 的不可靠(存在“域名欺骗”和“域名劫持”),你看到的网址里面的域名【未必】是真实滴!

所以,HTTPS 协议必须有某种机制来确保“真实性”的需求(至于如何确保,后面会细聊)。

性能

再来说最后一个需求——性能。引入 HTTPS 之后,【不能】导致性能变得太差。否则的话,谁还愿意用?为了确保性能,SSL 的设计者至少要考虑如下几点:

  1. 如何选择加密算法(“对称”or“非对称”)?
  2. 如何兼顾 HTTP 采用的“短连接”TCP 方式?(SSL 是在1995年之前开始设计的,那时候的 HTTP 版本还是 1.0,默认使用的是“短连接”的 TCP 方式——默认不启用 Keep-Alive)

以上就是设计 SSL 协议时,必须兼顾的各种需求。后面聊协议的实现时,俺会拿 SSL 协议的特点跟前面的需求作对照。看看这些需求是如何一一满足滴。

HTTPS的组成

加密

在密码学中,加密是指将明文转换为难以理解的密文;解密与之相反,是把密文换回明文。加密和解密都是由两部分组成:算法和密钥。

加密算法可以分为两类:对称加密和非对称加密。

对称加密

对称加密在加密和解密的过程中只是用一个密钥,这个密钥叫对称密钥,也叫共享密钥,如下图。

对称加密
对称加密

对称加密的优点就是计算速度快,缺点也很明显,就是通信两端需要分享密钥。客户端和服务器在进行对话前,要先将对称密钥发送给对方,在传输的过程中密钥有被窃取的风险,一旦被窃取,那么密文就能轻松翻译成明文,加密保护形同虚设。

非对称加密

非对称加密在加密的过程中使用公开密钥(public key),在解密的过程中使用私有密钥(private key)。加密和解密的过程也可以反过来。

非对称加密
非对称加密

非对称加密的缺点时计算速度慢,但它很好的解决了对称加密的问题,避免了信息泄露。通信两端如果都使用非对称加密,那么各自都会生成一对密钥,私钥留在身边,公钥发送给对方,公钥在传输途中即使被人窃取,也不用担心,因为没有私钥就无法轻易解密。在交换公钥后,就可以用对方的公钥把数据加密,开始密文对话。

HTTPS采用混合加密机制,将两种加密算法组合使用,充分利用各自的优点,博采众长。在交换公钥阶段采用非对称加密,在传输报文阶段使用对称加密。

数字签名

数字签名是一段由发送者生成的特殊加密校验码,用于确定报文的完整性,数字签名的生成涉及两种技术:非对称加密和数字摘要。

数字摘要可以将变长的报文提取为定长的摘要,报文内容不同提取的摘要也将不同,常用的摘要算法有 MD5 和 SHA。签名和校验的过程总共分为 5 步,如下如。

  1. 发送方用摘要算法对报文进行提取,生成一段摘要
  2. 然后用私钥对摘要进行加密,加密后的摘要作为数字签名附加在报文上,一起发送给接收方
  3. 接收方收到报文后,用同样的摘要算法提取出摘要
  4. 再用接收到的公钥对报文中的数字签名进行解密
  5. 如果两个摘要相同,那么就能证明报文没有被篡改
数字签名的校验过程
数字签名的校验过程

数字证书

数字证书相当于网络上的身份证,用于身份识别,由权威的数字认证机构(CAlendar)负责颁发和管理、数字证书的格式普遍遵循 X.509 国际标准,证书的内容包括:

  1. 有效期
  2. 颁发机构
  3. 颁发机构的签名
  4. 证书所有者的名称
  5. 证书所有者的公开密钥
  6. 版本号和唯一序列号

客户端(如浏览器)会预先植入一个受信任的颁发机构列表,如果收到的证书来自陌生的机构,那么会弹出一个安全警报对话框,如下图时IE浏览器的安全警报。

IE的安全警报
IE的安全警报

一般数字证书都会被安装在服务器处,当客户端发起安全请求时,服务器就会返回数字证书。客户端从受信机构列表中找到相应的公开密钥,解开数字证书。然后验证数字证书中的信息,如果验证通过,就说明请求来自意料之中的服务器;如果不通过,就说明证书被冒用,来源可疑,客户端立刻发出警告。下图描绘了这个认证过程。

数字证书的认证过程
数字证书的认证过程

安全通信机制

客户端和服务器将通过好几个步骤建立起安全连接,然后开始通信,下面时精简过的步骤:

  1. 客户端发送 Client Hello 报文开始 SSL 通信,报文中还包括协议版本号、加密算法等信息
  2. 服务器发送 Server Hello 报文作为应答,在报文中也会包括协议版本号、加密算法等信息
  3. 服务器发送数字证书,数字证书中包括服务器中的公开密钥
  4. 客户端解开并验证数字证书,验证通过后,生成一个随机密码串(premaster secure),再用收到的服务器公钥进行解密,发送给服务器
  5. 客户端再次发送 Change Cipher 报文,提示服务器在此条报文之后,采用刚刚生成的随机密码串进行数据加密
  6. 服务器也发送 Change Cipher Spec 报文
  7. SSL 连接建立完成,接下来就可以开始传输数据了

下图描绘了这些步骤

HTTPS通信
HTTPS通信

常见笔试面试题

HTTPS有哪些缺点?

HTTPS有如下4个缺点

  1. 通信两端都需要进行加密和解密,会消耗大量的CPU、内存等资源,增加了服务器的负载
  2. 加密运算和多次握手降低了访问速度
  3. 在开发阶段,加大了页面调试难度。由于信息都被加密了,所以用代理工具的话,需要先解密然后才能看到真实信息。
  4. 用 HTTPS 访问的页面,页面内的外部资源都得用HTTPS请求,包括脚本中的AJAX请求

什么是运营商劫持?有什么办法预防?

运营商是指提供网络服务的ISP(Internet Service Provider),例如三大基础运营商:中国电信、中国移动和中国联通。

运营商为了牟取经济利益,有时候会劫持用户的HTTP访问最明显的特征就是在页面上植入广告,有些是购物广告,有些却是淫秽广告,非常影响界面体验和公司形象。为了避免被劫持,可以让服务器支持 HTTPS HTTPS 协议,HTTPS传输的数据都被加密过了,运营商就无法再注入广告代码,这样页面就不会再被劫持。


相关推荐:


本文摘抄自《前端程序员面试笔试宝典》,媛媛之家/组编 平文 等/编著,机械工业出版社,版权归原作者所有