前言
最近在面试中被问到了HTTPS的相关问题,加上密码学也刚好学到公钥密码学,我就趁热打铁,整理一下HTTPS相关知识。
1.HTTPS简介
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
(1) 窃听风险(eavesdropping):第三方可以获知通信内容。
(2) 篡改风险(tampering):第三方可以修改通信内容。
(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
(1) 所有信息都是加密传播,第三方无法窃听。
(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。
(3) 配备身份证书,防止身份被冒充。
如果你对HTTP协议还不是很了解,可以先看看我整理的HTTP协议详解这篇文章。
2.HTTPS先修知识
HTTPS 涉及到了很多概念,比如 SSL/TSL,数字签名、数字证书、加密、认证、公钥和私钥等,比较容易混淆。我们先来了解一下这些概念。
如果你看不懂下面的概念,建议先把第3节的小故事看完,带着这些概念是什么的问题去看。
-
SSL/TSL
SSL:(Secure Socket Layer,安全套接字层)
TLS:(Transport Layer Security,传输层安全协议)
SSL/TLS 是 HTTPS 安全性的核心模块,TLS 的前身是 SSL,TLS1.0 就是 SSL3.1,TLS1.1 是 SSL3.2,TLS1.2 则是 SSL3.3。 SSL/TLS 是建立在 TCP 协议之上,因而也是应用层级别的协议。其包括 TLS Record Protocol 和 TLS Handshaking Protocols 两个模块,后者负责握手过程中的身份认证,前者则保证数据传输过程中的完整性和私密性。
其实认证用户和服务器,加密数据,维护数据完整性等等这些内容都是SSL/TLS干的事情
- 加密解密基础知识
(1)对称加密算法:就是加密和解密使用同一个密钥的加密算法。因为加密方和解密方使用的密钥相同,所以称为称为对称加密,也称为单钥加密方法。
优点是:加密和解密运算速度快,所以对称加密算法通常在消息发送方需要加密大量数据时使用;
缺点是:安全性差,如果一方的密钥遭泄露,那么整个通信就会被破解。另外加密之前双方需要同步密钥;
常用对称加密算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等;
(2)非对称加密算法(公钥加密):而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
公钥和私钥是一对:公钥用来加密,私钥解密,而且公钥是公开的,私钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
优点是:安全性更好,私钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
缺点是:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
常用的非对称加密算法有:RSA、Elgamal、Rabin、D-H、ECC等;
(3)HASH算法:也称为消息摘要算法。将任意长度的二进制值映射为较短的固定长度的二进制值,该二进制值称为哈希值。
常用于检验数据的完整性,检验数据没有被篡改过。常见的有 MD5(MD系列),SHA-1(SHA系列)
- 数字签名(digital signature)
将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。将该报文摘要值用发送者的私人密钥加密,然后连同原报文一起发送给接收者,而产生的报文即称数字签名。
写了一大堆,自己理解的签名就是:信息->hash->加密(私钥加密)。
为什么说签名呢?原因很简单,因为私钥是保密的,只有加密一方拥有。就好像是在一张纸上盖上了你的手印。
- 数字证书(digital certificate)
数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。
最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。
数字证书还有一个重要的特征就是只在特定的时间段内有效。
证书中包含的具体内容有:
(1)证书的发布机构CA
(2)证书的有效期
(3)公钥(证书所有者,即网站)
(4)证书所有者
(5)证书授权中心的数字签名
(6)证书所使用的签名算法---验证数字签名是要使用
(7)证书的序列号,每个证书都有一个唯一的证书序列号
证书的版本信息;
来看看证书长什么样吧
-
数字证书颁发过程
数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您自己的数字证书。
3.一个安全通信的故事
我们再来看一个关于 Bob 与他好朋友通信的故事(What is a Digital Signature?),好好理解下上面提到的概念。
需要说明一下的是,这个故事是从我参考的第一篇文章直接copy过来的,我只添加了说明3和说明4两部分内容
故事的主人公是 Bob,他有三个好朋友 Pat、Doug 和 Susan。Bob 经常跟他们写信。因为他的信是明文传输的,在传递过程可能被人截获偷窥,也可能被人截获然后又篡改了,更有可能别人伪装成 Bob 本人跟他的好朋友通信,总之是不安全的。他很苦恼,经过一番苦苦探索,诶,他发现计算机安全学里有一种叫非对称加密算法的东东,好像可以帮助他解决这个问题。
好了,来看看 Bob 是怎么应用非对称加密算法与他的好朋友通信的:
(1)首先 Bob 弄到了两把钥匙:公钥和私钥
(2)Bob 自己保留下了私钥,把公钥复制成三份送给了他的三个好朋友 Pat、Doug 和 Susan;
(3)此时,Bob 总算可以安心地和他的好朋友愉快地通信了。比如 Susan 要和他讨论关于去哪吃午饭的事情,Susan 就可以先把自己的内容(明文)首先用 Bob 送给他的公钥做一次加密,然后把加密的内容传送给 Bob。Bob 收到信后,再用自己的私钥解开信的内容;
说明:这其实是计算机安全学里加密的概念,加密的目的是为了不让别人看到传送的内容,加密的手段是通过一定的加密算法及约定的密钥进行的(比如上述用了非对称加密算法以及 Bob 的公钥),而解密则需要相关的解密算法及约定的秘钥(如上述用了非对称加密算法和 Bob 自己的私钥),可以看出加密是可逆的(可解密的)。
(4)Bob 看完信后,决定给 Susan 回一封信。为了防止信的内容被篡改(或者别人伪装成他的身份跟 Susan 通信),他决定先对信的内容用 hash 算法做一次处理,得到一个字符串哈希值,Bob 又用自己的私钥对哈希值做了一次加密得到一个签名,然后把签名和信(明文的)一起发送给 Susan;
说明 2:Bob 的内容实质是明文传输的,所以这个过程是可以被人截获和窥探的,但是 Bob 不担心被人窥探,他担心的是内容被人篡改或者有人冒充自己跟 Susan 通信。这里其实涉及到了计算机安全学中的认证概念,Bob 要向 Susan 证明通信的对方是 Bob 本人,另外也需要确保自己的内容是完整的。
(5)Susan 接收到了 Bob 的信,首先用 Bob 给的公钥对签名作了解密处理,得到了哈希值 A,然后 Susan 用了同样的 Hash 算法对信的内容作了一次哈希处理,得到另外一个哈希值 B,对比 A 和 B,如果这两个值是相同的,那么可以确认信就是 Bob 本人写的,并且内容没有被篡改过;说明:4 跟 5 其实构成了一次完整的通过数字签名进行认证的过程。数字签名的过程简述为:发送方通过不可逆算法对内容 text1 进行处理(哈希),得到的结果值 hash1,然后用私钥加密 hash1 得到结果值 encry1。对方接收 text1 和 encry1,用公钥解密 encry1 得到 hash1,然后用 text1 进行同等的不可逆处理得到 hash2,对 hash1 和 hash2 进行对比即可认证发送方。
(6)此时,另外一种比较复杂出现了,Bob 是通过网络把公钥寄送给他的三个好朋友的,有一个不怀好意的家伙 Jerry 截获了 Bob 给 Doug 的公钥。Jerry 开始伪装成 Bob 跟 Doug 通信,Doug 感觉通信的对象不像是 Bob,但是他又无法确认;
说明3:需要注意,Jerry 开始伪装Bob的过程是这样的:Jerry 截获了 Bob 给 Doug 的公钥,然后把这个公钥换成自己的公钥,再发送给Doug。这样Jerry就可以冒充Bob,用Jerry自己的私钥完成与Doug的通信。
(7)Bob 最终发现了自己的公钥被 Jerry 截获了,他感觉自己的公钥通过网络传输给自己的小伙伴似乎也是不安全的,不怀好意的家伙可以截获这个明文传输的公钥。为此他想到了去第三方权威机构"证书中心"(certificate authority,简称 CA)做认证。证书中心用自己的私钥对 Bob 的公钥和其它信息做了一次加密。这样 Bob 通过网络将数字证书传递给他的小伙伴后,小伙伴们先用 CA 给的公钥解密证书,这样就可以安全获取 Bob 的公钥了
说明4:证书中心"(certificate authority,简称 CA)是可信的。只要证书是可信的,公钥就是可信的。
4.HTTPS 通信过程
通过 Bob 与他的小伙伴的通信,我们已经可以大致了解一个安全通信的过程,也可以了解基本的加密、解密、认证等概念。HTTPS 就是基于这样一个逻辑设计的。
首先看看组成 HTTPS 的协议:HTTP 协议和 SSL/TSL 协议。HTTP 协议就不用讲了,而 SSL/TSL 就是负责加密解密等安全处理的模块,所以 HTTPS 的核心在 SSL/TSL 上面。整个通信如下:
(1)浏览器发起往服务器的 443 端口发起请求,请求携带了浏览器支持的加密算法和哈希算法。
(2)服务器收到请求,选择浏览器支持的加密算法和哈希算法。
(3)服务器下将数字证书返回给浏览器,这里的数字证书可以是向某个可靠机构申请的,也可以是自制的。
(4)浏览器进入数字证书认证环节,这一部分是浏览器内置的 TSL 完成的:
(4.1)首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构的公钥。
(4.2)证书内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性(验证过程类似上面 Bob 和 Susan 的通信)。签名通过后(即证书是可信的),浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。
(4.3)浏览器生成一个随机数 R,并使用网站公钥对 R 进行加密,并计算握手消息hash。
(5)浏览器将加密的 R 和hash摘要值传送给服务器。
(6)服务器用自己的私钥解密得到 R,验证hash摘要值。
(7)服务器以 R 为密钥使用了对称加密算法加密网页内容并传输给浏览器。
(8)浏览器以 R 为密钥使用之前约定好的解密算法获取网页内容。
备注 1:前 5 步其实就是 HTTPS 的握手过程,这个过程主要是认证服务端证书(内置的公钥)的合法性。因为非对称加密计算量较大,整个通信过程只会用到一次非对称加密算法(主要是用来保护传输客户端生成的用于对称加密的随机数私钥)。后续内容的加解密都是通过一开始约定好的对称加密算法进行的。
5.HTTPS 缺点
(1)SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐
(2)HTTPS 降低用户访问速度(多次握手)
(3)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)
(4)HTTPS 涉及到的安全算法会消耗 CPU 资源,需要增加大量机器(https访问过程需要加解密)
总结:
(1)HTTPS 结合使用了 非对称加密算法,对称加密算法,hash算法,分别利用他们的优势,避免他们的缺点。利用非对称加密算法获得对称加密算法的秘钥,保证他的安全性;然后实际的网页内容的加密使用的是对称加密算法,利用了对称加密算法速度快的优势,hash算法主要是防止篡改的发生,是一种校验机制,最后数字证书,保证了服务器在将非对称加密算法的公钥传给浏览器时的安全性(不会被中间人篡改),同时也标志了服务器的身份。
(2)HTTPS的四大金刚:
非对称加密算法(对称加密算法的秘钥) + 对称加密算法(加密内容) + 数字证书(防止篡改非对称加密算法的公钥) + HASH算法(防止篡改消息)== HTTPS
(3)HTTPS的本质是什么?
HTTPS的本质就是在HTTP连接发起之前,先使用SSL/TLS协议,协调客户端和服务端,在两端各自生产一个对称加密算法的秘钥,
然后使用普通的HTTP协议传输 经过对称加密算法加密的网页内容。因为对称加密算法的秘钥是安全的,所以对称加密算法加密的网页内容也是安全的。
参考文章
深入浅出 HTTPS 工作原理
HTTPS(SSL/TLS) 原理之深入浅出
深度解析HTTPS原理
深入浅出HTTPS基本原理