在上一文中,讲述了 HTTP 的种种安全性问题,要解决的话,就要用 HTTPS。
HTTP 加上加密处理和认证以及完整性保护后即是 HTTPS。
经常会在 Web 的登录页面和购物结算界面等使用 HTTPS 通信,比如打开淘宝的登录页。
- 使用 HTTPS 通信时,不再用
http://
,而是改用https://
。
- 当浏览器访问 HTTPS 通信有效的 Web 网站时,浏览器的地址栏内会出现一个带锁的标记。
一、HTTPS 是身披 SSL 外壳的 HTTP
首先要明确:HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。
- 通常,HTTP 直接和 TCP 通信。
- 当使用 SSL时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。
SSL 是独立于 HTTP 的协议。
所以,不光是 HTTP 协议,其他运行在应用层的协议,比如 SMTP 和 Telnet 等,均可配合 SSL 协议使用。可以说 SSL 是 当今世界上应用最为广泛的网络安全技术。
二、相互交换密钥的公开密钥加密技术
SSL 采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。
不过在继续了解之前,先看下这2种:
- 共享密钥加密。
- 公开密钥加密。
1. 共享密钥加密
加密和解密同用一个密钥(也叫对称密钥加密),加密时必须将密钥也发给对方,那么如何安全地把密钥交给对方是个问题。
- 如果在互联网上转发密钥时,通信被监听,那么密钥就可会落入攻击者之手,同时也就失去了加密的意义。
- 此外,接收方还得设法安全地保管接收到的密钥。
2. 公开密钥加密
针对上面的问题,于是有了公开密钥加密方式。解决思路也很简单:既然担心密钥在发送过程中被盗走,那么我不发送密钥不就解决了?
于是,公开密钥加密使用一对非对称的密钥,分别是:
- 私有密钥 (private key):私有密钥不能让其他任何人知道。
- 公开密钥(public key):公开密钥则可以随意发布,任何人都可以获得。
交互过程是这样的(发送密文方A,接收方B):
- A 使用 B 的公开密钥进行加密。
- A 发送加密后的信息给 B。
- B 收到加密的信息后,用自己的私有钥匙进行解密。
利用这种方式,不需要发送用来解密的私有密钥,也就不必担心密钥被攻击者窃听而盗走。
另外,就算你知道了公开密钥和密文,想要恢复到信息原文是异常困难的。
因为解密过程就是在对离散对数进行求值,这并非轻而易举就能办到。
再退一步讲,如果能对一个非常大的整数做到快速地因式分解,那么密码破解还是存在希望的。但就目前的技术来看是不太现实的。
3. HTTPS 采用混合加密机制
HTTPS 采用以上2种加密方式的混合加密机制。
因为,公开密钥加密处理起来比共享密钥加密更加复杂,因此在通信中使用时,效率就更低。
所以应充分利用两者各自的优势:
- 在交换密钥环节使用公开密钥加密方式。
- 之后的建立通信交换报文阶段则使用共享密钥加密方式。
三、证明公开密钥正确性的证书
环环相扣,在上述的公开密钥加密方式还是存在一些问题:
- 无法证明公开密钥本身就是货真价实的公开密钥。
比如,A 整准备和 B 服务器建立公开密钥加密方式下的通信,A 也确实收到了公开密钥。但是 A 不知道这个公开密钥是不是真的来自于 B,或许在传输途中,真的公开密钥已经被攻击者替换掉了。
于是,为了解决这个问题,需要使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。
1. 什么是 数字证书认证机构?
是处于客户端与服务器双方都可信赖的第三方机构,比如威瑞信(VeriSign)。
业务流程:
- 首先,服务器把自己的公开密钥登录至机构。
- 机构用自己的私有密钥像服务器的公开密钥数字签名,并颁发公钥证书(服务器公开密钥+机构的数字签名)。
- 服务器将证书发送个客户端。
- 接收到证书的客户端,使用机构的公开密钥对证书上的数字签名进行验证。
一旦验证通过,就说明:
- 认证服务器的公开密钥的是真实有效的数字证书认证机构。
- 服务器的公开密钥是值得信赖的。
OK,看起来很不错。但是在服务器转交认证的公开密钥给客户端的时候,如何安全转交也是一件困难的事情。
既然转交过程有风险,那么尽量不转交。因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
万事大吉后,客户端就可以使用公开密钥对报文加密后发送了,服务器收到后再用私有密钥对报文解密即可。
2. 证书的类型
- 可证明组织真实性的 EV SSL 证书
证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在,EV SSL证书就有此特性。
- 用以确认客户端的客户端证书
HTTPS 中还可以使用客户端证书。以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端。这个在一些网上银行会有,比如登录网银时不仅 要求用户确认输入 ID 和密码,还会要求用户的客户端证书,就是用来确认用户是否从特定的终端访问网银。
- 由自认证机构颁发的证书称为自签名证书
通过使用 OpenSSL这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但是这种证书浏览器很可能不认,访问时会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。
按理说,认证机构信誉第一,信用要绝对可靠。但是也存在遭到黑客入侵的风险。2011 年 7 月,荷兰的一家名叫 DigiNotar 的认证机构曾遭黑客不法入侵,颁布了 google.com 和 twitter.com 等网站的伪造证书事件。这一事件从根本上撼动了 SSL的可信度。
四、使用 SSL 影响了速度
SSL的慢分两种:通信慢、处理速度慢。
通信慢
和使用HTTP相比,HTTPS 除去和 TCP 连接、发送 HTTP 请求 • 响应以外,还必须进行 SSL通信,所以整体上处理通信量会增加。
相比之下,HTTPS 比 HTTP 要慢 2 到 100 倍
处理速度慢
由于 HTTPS 还需要做服务器、客户端双方加密、界面处理,因此会消耗更多的CPU和内存等硬件资源。
对此,没有根本性解决方案。不过有一种 SSL加速器(专用服务器)硬件可以来改善该问题。该硬件为 SSL通信专用硬件,相对软件来讲,能够提高数倍 SSL 的计算速 度。仅在 SSL 处理时发挥 SSL 加速器的功效,以分担负载。
五、为什么不一直使用 HTTPS
灵魂拷问:既然 HTTPS 那么安全可靠,那为何所有的 Web 网站不一直使用 HTTPS ?
原因 1
与纯文本通信相比,加密通信会消耗更多的 CPU 及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少
。
而且有的web网站访问量很大,都加密处理,服务器鸭梨山大。
所以,一般对于敏感信息的处理,比如用户个人信息,才利用 HTTPS 加密通信。对一些其他非敏感的信息,就用 HTTP 通信即可。
原因 2
钱。
上面提到的证书是要花钱从认证机构那购买的。所以,那些购买证书并不合算的服务以及一些个人网站,可能只会选择采用 HTTP 的通信方式。