http与https的区别我真的知道吗

之前每次看到类似“http与https的区别?”的问题时,都会自己思考一下答案,好像只是浅显地知道https比http安全,但究竟为什么更安全,却又似乎说不出个所以然,或者说很多细节地方自己都是不清楚的。为了搞清楚,也为了系统地了解一下http相关的知识,前段时间阅读了一波《图解HTTP》,不得不说这本书真的算是通俗易懂,了解到了很多之前不清楚的知识点(协议、报文、状态码、首部字段、身份认证、资源缓存以及web攻击等)。如果想了解更多http相关的知识的同学当然也可以选择阅读《HTTP权威指南》。

HTTP

HTTP,全称超文本传输协议,是一种详细规定客户端与web服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。它的特点是:

  • 无状态,每个请求结束后都会被关闭,每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况;服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器,就像是“人生只如初见”,比如说用户需要请求某个数据,需要登录权限,用户登录之后进行请求,结果因为http的无状态,等用户下一次还想请求一份数据,还需要再次登录,这样不就很烦了吗,所以就需要session和cookie来进行状态管理了。

  • 明文传输(未经过加密的报文),为什么通信时不加密是一个缺点,这是因为,按TCP/IP 协议族的工作机制,通信内容在所有的通信线路上都有可能遭到窥视。无论世界哪个角落的服务器在和客户端通信时,在此通信线路上的某些网络设备、光缆、计算机等都不可能是个人的私有物,所以不排除某个环节中会遭到恶意窥视行为。即使已经过加密处理的通信,也会被窥视到通信内容,这点和未加密的通信是相同的。只是说如果通信经过加密,就有可能让人无法破解报文信息的含义,但加密处理后的报文信息本身还是会 被看到的。

  • 不验证通信方的身份,因此有可能遭遇伪装。HTTP 协议中的请求和响应不会对通信方进行确认。也就是说存在“服务器是否就是发送请求中 URI 真正指定的主机,返回的响应是否真的返回到实际提出请求的客户端”等类似问题。在 HTTP 协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应(但也仅限于发送端的 IP 地址和端口号没 有被 Web 服务器设定限制访问的前提下;不论是谁发送过来的请求都会返回响应,因此不确认通信方,会存在以下各种隐患:1、无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的 Web 服务器;2、无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端;3、无法确定正在通信的对方是否具备访问权限。因为某些Web 服务器上保存着重要的信息,只想发给特定用户通信的权限;4、无法判定请求是来自何方、出自谁手;5、即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击(Denial of Service,拒绝服务攻击)。

  • 无法证明报文的完整性。因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉;换句话说,没有任何办法确认,发出的请求 / 响应和接收到的请 求 / 响应是前后相同的。

HTTPS

HTTPS,全称Hyper Text Transfer Protocol Secure,相比http,多了一个secure,也就是TLS(SSL),一个安全套接层。https和http都属于应用层(application layer),基于TCP(以及UDP)协议,但是又完全不一样。TCP用的port是80, https用的是443。

HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。通常,HTTP 直接和 TCP 通信。当使用 SSL时,则演变成先和 SSL通信,再由 SSL和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披SSL协议这层外壳的 HTTP。

image

HTTPS解决的问题:

  • 信任主机的问题.。 采用https 的server 必须从CA (数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的 立场上)申请一个用于证明服务器用途类型的证书,该证书有了CA的签名,客户端才能知道访问的服务器是安全的。 目前基本所有的在线购物和网银等网站或系统,关键部分应用都是https 的,客户通过信任该证书,从而信任了该主机,这样才能保证安全。

  • 通讯过程中的数据的泄密和被窜改 使用https协议,服务端和客户端之间的所有通讯都是加密的。客户端和服务端各有自己的一对非对称的密钥,一把叫做私有密钥(private key),另一把叫做公开密钥(public key),顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。要想根据密文和公开密钥,恢复到信息原文是异常困难的,因为解密过程就是在对离散对数进行求值,这并非轻而易举就能办到。退一步讲,如果能对一个非常大的整数做到快速地因式分解,那么密码破解还是存在希望的。但就目前的技术来看是不太现实的。

    image

简单点说就是:HTTP + 认证 + 加密 + 完整性保护 = HTTPS

HTTPS 的通信步骤

image

  • 步骤 1: 客户端通过发送 Client Hello 报文开始 SSL通信。报文中包含客户端支持的 SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
  • 步骤 2: 服务器可进行 SSL通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
  • 步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。
  • 步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL握手协商部分结束。
  • 步骤 5: SSL第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-mastersecret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。
  • 步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。
  • 步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
  • 步骤 8: 服务器同样发送 Change Cipher Spec 报文。
  • 步骤 9: 服务器同样发送 Finished 报文。
  • 步骤 10: 服务器和客户端的 Finished 报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到 SSL的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。
  • 步骤 11: 应用层协议通信,即发送 HTTP 响应。
  • 步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。

下面是对整个流程的图解。图中说明了从仅使用服务器端的公开密钥证书(服务器证书)建立 HTTPS 通信的整个过程。

image

HTTPS的加密技术

  • 共享密钥加密的困境

    加密和解密同用一个密钥的方式称为共享密钥加密(Common key crypto system),也被叫做对称密钥加密。以共享密钥方式加密时必须将密钥也发给对方。可究竟怎样才能 安全地转交?在互联网上转发密钥时,如果通信被监听那么密钥 就可会落入攻击者之手,同时也就失去了加密的意义。另外还得 设法安全地保管接收到的密钥。也就是说,发送密钥就存在被窃听的风险,不发送,对方就不能解密。再说如果密钥能够安全送达,那么数据也能够安全送达,那加密也就失去其意义了。

  • 使用两把密钥的公开密钥加密

    公开密钥加密方式很好地解决了共享密钥加密的困难。公开密钥加密使用一对非对称的密钥。一把叫做私有密钥(private key),另一把叫做公开密钥(public key)。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。 使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进 行加密处理,对方收到被加密的信息后,再使用自己的私有密钥 进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。 另外,要想根据密文和公开密钥,恢复到信息原文是异常困难的,因为解密过程就是在对离散对数进行求值,这并非轻而易举 就能办到。退一步讲,如果能对一个非常大的整数做到快速地因式分解,那么密码破解还是存在希望的。但就目前的技术来看是不太现实的。

  • HTTPS 采用混合加密机制

    因此,HTTPS采用的是共享密钥加密和公开密钥加密两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。所以应充分利用两者各自的优势,将多种方法组合起来用于通信。在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。上图中生成的master secret即共享密钥,之后的交换的报文信息都将使用它来进行加密。

HTTPS加密

HTTPS的问题

  • HTTPS足够安全吗?世界上没有绝对的安全。比如2014年的Heartbleed漏洞席卷全球,很多网站受到heartbleed威胁,其中就有雅虎,stackoverflow这样的网站。但总的来说对于绝大部分人来说HTTPS还是相对安全的,至少比HTTP安全。
  • HTTPS 还有一个问题,那就是当使用 SSL时,它的处理速度会变

image

SSL的慢分两种。一种是指通信慢。另一种是指由于大量消耗CPU 及内存等资源,导致处理速度变慢。

  • 和使用 HTTP 相比,网络负载可能会变慢 2 到 100 倍。除去和TCP 连接、发送 HTTP 请求 • 响应以外,还必须进行 SSL通信,因此整体上处理通信量不可避免会增加。
  • 另一点是 SSL必须进行加密处理。在服务器和客户端都需要进行加密和解密的运算处理。因此从结果上讲,比起 HTTP 会更多地消耗服务器和客户端的硬件资源,导致负载增强。 -针对速度变慢这一问题,并没有根本性的解决方案,我们会使用SSL加速器这种(专用服务器)硬件来改善该问题。该硬件为SSL通信专用硬件,相对软件来讲,能够提高数倍 SSL的计算速度。仅在 SSL处理时发挥 SSL加速器的功效,以分担负载。

为什么不一直使用 HTTPS?

  • 因为与纯文本通信相比,加密通信会消耗更多的CPU 及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。因此,如果是非敏感信息则使用 HTTP 通信,只有在包含个人信息等敏感数据时,才利用 HTTPS 加密通信。特别是每当那些访问量较多的 Web 网站在进行加密处理时,它们所承担着的负载不容小觑。在进行加密处理时,并非对所有内容都进行加密处理,而是仅在那些需要信息隐藏时才会加密,以节约资源。

  • 想要节约购买证书的开销也是原因之一。 要进行 HTTPS 通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。证书价格可能会根据不同的认证机构略有不同。那些购买证书并不合算的服务以及一些个人网站,可能只会选择采用 HTTP 的通信方式。

参考书籍

《图解HTTP》

《HTTP权威指南》