Summary:
HTTP 通信时,可能信息被监听、服务器或客户端身份伪装等安全问题,HTTPS 则能有效解决这些问题。
原始的HTTP连接的时候,因服务器与用户之间是直接进行明文传输,导致用户面临着很多的风险与威胁。攻击者可以轻易的截获或者篡改传输的数据。包括窃取用户的Session信息、注入有害的代码等,乃至于修改用户传送至服务器的数据。
我们并不能替用户选择所使用的网络,他们很有可能使用一个开放的,任何人都可以窃听的网络,譬如一个咖啡馆或者机场里面的开放WiFi网络。普通的 用户很有可能被欺骗地随便连上一个叫免费热点的网络,或者使用一个可以随便被插入广告的网路当中。如果攻击者会窃听或者篡改网路中的数据,那么用户与服务 器交换的数据就好不可信了,幸好HTTPS 的出现则能有效解决这些问题。
HTTPS最早主要用于经融这样安全要求较高的敏感网络,譬如常用的社交网络和搜索引擎。 HTTPS协议使用的是TLS(SSL的升级版本)协议,只要配置与使用得当,就能有效抵御窃听与篡改,从而有效保护我们将要去访问的网站。用技术化的方式说,HTTPS能够有效保障数据机密性与完整性,并且能够完成用户端与客户端的双重验证。
随着面临的风险日渐增多,我们应该将所有的网络数据当做敏感数据并且进行加密传输。已经有很多的浏览器厂商宣称要废弃所有的非HTTPS的请求。目前如果要大范围推广使用HTTPS还是有些难度,现在大范围内使用HTTPS会被认为造成很多计算资源的浪费,不过随着现代硬件与浏览器的发展,这点计算资源已经不足为道。另外,从一个证书认证机构获取证书也会打消一些用户使用HTTPS的念头,不过下面我们介绍的像Let‘s Encrypt这样的免费的服务就可以打破这种障碍。
Why HTTPS?
HTTP日常使用极为广泛的协议,它很优秀且方便,但还是存在一些问题,如:
明文通信,内容可以直接被窃听
无法验证报文的完整性,可能被篡改
通信方身份不验证,可能遇到假的客户端或服务器
中间人攻击与内容窃听
HTTP 不会对请求和响应的内容进行加密,报文直接使用明文发送。报文在服务器与客户端流转中间,会经过若干个结点,这些结点中随时都可能会有窃听行为。因为通信一定会经过中间很多个结点,所以就算是报文经过了加密,也一样会被窃听到,不过是窃听到加密后的内容。要窃听相同段上的通信还是很简单的,比如可以使用常用的抓包工具 Wireshark。这种情况下,保护信息安全最常用的方式就是采取加密了,加密方式可以根据加密对象分以下几种:
(1)通信加密
HTTP 协议基于 TCP/IP 协议族,它没有加密机制。但可以通过 SSL(Secure Socket Layer,安全套接层)建立安全的通信线路,再进行 HTTP 通信,这种与 SSL 结合使用的称为 HTTPS(HTTP Secure,超文本传安全协议)。
(2)内容加密
还可以对通信内容本身加密。HTTP 协议中没有加密机制,但可以对其传输的内容进行加密,也就是对报文内容进行加密。这种加密方式要求客户端对 HTTP 报文进行加密处理后再发送给服务器端,服务器端拿到加密后的报文再进行解密。这种加密方式不同于 SSL 将整个通信线路进行加密,所以它还是有被篡改的风险的。
报文篡改
(1)接收到的内容可能被做假
HTTP 协议是无法证明通信报文的完整性的。因此请求或响应在途中随时可能被篡改而不自知,也就是说,没有任何办法确认,发出的请求/响应和接收到的请求/响应是前后相同的。比如浏览器从某个网站上下载一个文件,它是无法确定下载的文件和服务器上有些话的文件是同一个文件的。文件在传输过程中被掉包了也是不知道的。这种请求或响应在传输途中,被拦截、篡改的攻击就是中间人攻击。比如某运营商或者某些DNS提供商会偷偷地在你的网页中插入广告脚本,就是典型的例子。
(2) 防篡改
也有一些 HTTP 协议确定报文完整性的方法,不过这些方法很不方便,也不太可靠。用得最多的就是 MD5 等散列值校验的方法。很多文件下载服务的网站都会提供相应文件的 MD5 散列值,一来得用户亲自去动手校验(中国估计只有 0.1% 不到的用户懂得怎么做吧),二来如果网站提供的 MD5 值也被改写的话呢?所以这种方法不方便也不可靠。
仿冒服务器/客户端
(1) DDOS攻击与钓鱼网站
在 HTTP 通信时,由于服务器不确认请求发起方的身份,所以任何设备都可以发起请求,服务器会对每一个接收到的请求进行响应(当然,服务器可以限制 IP 地址和端口号)。由于服务器会响应所有接收到的请求,所以有人就利用这一点,给服务器发起海量的无意义的请求,造成服务器无法响应正式的请求,这就是 Dos 攻击(Denial Of Service,拒绝服务攻击)。由于客户端也不会验证服务器是否真实,所以遇到来自假的服务器的响应时,客户端也不知道,只能交由人来判断。钓鱼网站就是利用了这一点。
(2) 身份认证
HTTP 协议无法确认通信方,而 SSL 则是可以的。SSL 不仅提供了加密处理,还提供了叫做“证书”的手段,用于确定通信方的身份。证书是由值得信任的第三方机构颁发(已获得社会认可的企业或组织机构)的,用以证明服务器和客户端的身份。而且伪造证书从目前的技术来看,是一件极为难的事情,所以证书往往可以确定通信方的身份。以客户端访问网页为例。客户端在开始通信之前,先向第三机机构确认 Web 网站服务器的证书的有效性,再得到其确认后,再开始与服务器进行通信。
Definition
HTTPS = HTTP + 加密 + 认证 + 完整性保护,HTTPS 也就是 HTTP 加上加密处理、认证以及完整性保护。使用 HTTPS 通信时,用的是 https://,而不是 http://。另外,当浏览器访问 HTTPS 的 Web 网站时,浏览器地址栏会出现一个带锁的标记。要注意,HTTPS 并非是应用层的新协议,而是 HTTP 通信接口部分用 SSL 协议代替而已。本来,HTTP 是直接基于 TCP 通信。在 HTTPS 中,它先和 SSL 通信,SSL 再和 TCP 通信。所以说 HTTPS 是披了层 SSL 外壳的 HTTP。SSL 是独立于 HTTP 的协议,所以其他类似于 HTTP 的应用层 SMTP 等协议都可以配合 SSL 协议使用,也可以给它们增强安全性
Performance
HTTPS 使用 SSL 通信,所以它的处理速度会比 HTTP 要慢。
一是通信慢。它和 HTTP 相比,网络负载会变慢 2 到 100倍。除去和 TCP 连接、发送 HTTP 请求及响应外,还必须进行 SSL 通信,因此整体上处理通信量会不可避免的增加。
二是 SSL 必须进行加密处理。在服务器和客户端都需要进行加密和解密的去处处理。所以它比 HTTP 会更多地消耗服务器和客户端的硬件资源。
Reference
https://en.wikipedia.org/wiki/HTTP
https://en.wikipedia.org/wiki/Transport_Layer_Security
https://en.wikipedia.org/wiki/HTTPS
https://en.wikipedia.org/wiki/RSA_(cryptosystem)
SSL/TLS Protocol
SSL协议,是一种安全传输协议,最初是由 Netscape 在1996年发布,由于一些安全的原因SSL v1.0和SSL v2.0都没有公开,直到1996年的SSL v3.0。TLS是SSL v3.0的升级版,目前市面上所有的Https都是用的是TLS,而不是SSL。本文中很多地方混用了SSL与TLS这个名词,大家能够理解就好。
其中Handshake protocol,Change Ciper Spec protocol和Alert protocol组成了SSL Handshaking Protocols。
Record Protocol有三个连接状态(Connection State),连接状态定义了压缩,加密和MAC算法。所有的Record都是被当前状态(Current State)确定的算法处理的。
TLS Handshake Protocol和Change Ciper Spec Protocol会导致Record Protocol状态切换。
empty state -------------------> pending state ------------------> current state
Handshake Protocol Change Cipher Spec
初始当前状态(Current State)没有指定加密,压缩和MAC算法,因而在完成TLS Handshaking Protocols一系列动作之前,客户端和服务端的数据都是明文传输的;当TLS完成握手过程后,客户端和服务端确定了加密,压缩和MAC算法及其参数,数据(Record)会通过指定算法处理。
密码学原理
数据在传输过程中,很容易被窃听。加密就是保护数据安全的措施。一般是利用技术手段把数据变成乱码(加密)传送,到达目的地后,再利用对应的技术手段还原数据(解密)。加密包含算法和密钥两个元素。算法将要加密的数据与密钥(一串数字)相结合,产生不可理解的密文。由此可见,密钥与算法同样重要。对数据加密技术可以分为两类:对称加密(对称密钥加密)和非对称加密(非对称密钥加密)。SSL 采用了 非对称加密(Public-key cryptography)的加密处理方式。
现在的加密方法中,加密算法都是公开的,网上都有各种算法原理解析的内容。加密算法虽然是公开的,算法用到的密钥却是保密的,以此来保持加密方法的安全性。加密和解密都会用到密钥。有了密钥就可以解密了,如果密钥被攻击者获得,加密也就没有意义了。
对称加密/非公开密钥加密
对称加密的意思就是,加密数据用的密钥,跟解密数据用的密钥是一样的。对称加密的优点在于加密、解密效率通常比较高。缺点在于,数据发送方、数据接收方需要协商、共享同一把密钥,并确保密钥不泄露给其他人。此外,对于多个有数据交换需求的个体,两两之间需要分配并维护一把密钥,这个带来的成本基本是不可接受的。
非对称加密/公开密钥加密
非对称加密方式能很好地解决对称加密的困难。非对称加密方式有两把密钥。一把叫做私有密钥(private key),另一把叫做非对称(public key)。私有密钥是一方保管,而非对称则谁都可以获得。这种方式是需要发送密文的一方先获得对方的非对称,使用已知的算法进行加密处理。对方收到被加密的信息后,再使用自己的私有密钥进行解密。这种加密方式有意思是的加密算法的神奇,经过这个公开的算法加密后的密文,即使知道非对称,也是无法对密文还原的。要想对密文进行解决,必须要有私钥才行。所以非对称加密是非常安全的,即使窃听到密文和非对称,却还是无法进行解密。
非对称加密算法用的一般是 RSA 算法(这可能是目前最重要的算法了)。这个算法由3个小伙子在1977年提出,它的主要原理是:将两个大素数相乘很简单,但想要这个乘积进行因式分解极其困难,因此可以将乘积公开作为非对称。不过随着目前的分布式计算和量子计算机的快速发展,说不定在将来也许能破解这个算法了。
证书
在测试的时候我们可以自己创建配置一个证书用于HTTPS认证,不过如果你要提供服务给普通用户使用,那么还是需要从可信的第三方CA机构来获取可信的证 书。对于很多开发者而言,一个免费的CA证书是个不错的选择。当你搜索CA的时候,你可能会遇到几个不同等级的证书。最常见的就是Domain Validation(DV),用于认证一个域名的所有者。再往上就是所谓的Organization Validation(OV)与Extended Validation(EV),包括了验证这些证书的请求机构的信息。虽然高级别的证书需要额外的消耗,不过还是很值得的。