1 什么是 HTTP?
HTTP 协议即超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议。
HTTP 是基于 TCP/IP 通信协议来传递数据的。HTTP 协议工作于客户端-服务端架构之上,浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。
2 什么是 HTTPS?
HTTPS 是身披 SSL 外壳的 HTTP,HTTPS 是一种通过计算机网络进行安全通信的传输协议,经由 HTTP 进行通信,利用 SSL/TLS 建立安全信道,加密数据包。HTTPS 使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
如何理解 SSL?
HTTPS 的安全基础是 SSL。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协议可分为两层:SSL 记录协议,它建立在可靠的传输协议(如 TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议,它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL 提供了哪些服务?
1 认证用户和服务器,确保数据发送到正确的客户机和服务器
2 加密数据以防止数据中途被窃取
3 维护数据的完整性,确保数据在传输过程中不被改变
3 HTTP 与 HTTPS 的特点对比
HTTP 特点:
- 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
- 无连接:在 HTTP/1.1 之前,限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
- 基于请求和响应:客户端发起请求,服务端响应
- 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快
- 通信使用明文,请求和响应不会对通信方进行确认,无法保护数据的完整性
HTTPS 特点:
- 内容加密:采用了混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改
如何理解混合加密?
混合加密结合了非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对密钥进行加密,所以网络上传输的数据是被密钥加密的密文和用公钥加密后的密钥,即使被黑客截取,由于没有私钥,无法获取到加密明文的密钥,便无法获取到明文数据。
4 HTTP 工作原理
HTTP协议采用了请求/响应模型。HTTP 请求/响应的步骤如下:
- 客户端连接到 Web 服务器:HTTP 客户端与 Web 服务器的 HTTP 端口(默认为80)建立一个 TCP 套接字连接
- 发送 HTTP 请求:通过 TCP 套接字,客户端向 Web 服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成
- 服务器接受请求并返回 HTTP 响应:Web 服务器解析请求,定位请求资源。服务器将资源复本写到 TCP 套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成
- 释放连接 TCP 连接:若 connection 模式为 close,则服务器主动关闭 TCP 连接,客户端被动关闭连接,释放 TCP 连接;若 connection 模式为 keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求
- 客户端浏览器解析 HTML 内容
5 HTTPS 工作原理
- 客户端向服务器发送请求,然后连接到服务器的443端口,并传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息
- 服务器接收到信息之后给予客户端响应握手信息,包括 SSL 协议的版本号,加密算法的种类(客户端发送给服务器加密算法的子集),随机数以及其他相关信息
- 服务器向客户端传送自己的证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容
- 客户端解析证书,该工作由客户端的 TLS 完成,如果没有问题,将生成一个被称为预主秘钥的随机值
- 客户端认证证书通过之后,接下来是通过客户端的随机值、服务器的随机值和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥
- 客户端传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到两个随机值和预主秘钥
- 服务端解密得到两个随机值和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同
- 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息
- 服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明 SSL 层连接建立完成了
数字证书包括什么内容?
包括了加密后服务器的公钥、权威机构的信息、服务器域名,还有经过 CA 私钥签名之后的证书内容(经过先通过 Hash 函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名
如何验证证书安全性?
当客户端收到证书之后,使用本地配置的权威机构的公钥对证书进行解密得到服务端的公钥和证书的数字签名,数字签名经过 CA 公钥解密得到证书信息摘要。
根据证书签名的方法计算一下当前证书的信息摘要,与收到的信息摘要作对比,如果一样,表示证书一定是服务器下发的,没有被中间人篡改过。因为中间人虽然有权威机构的公钥,能够解析证书内容并篡改,但是篡改完成之后中间人需要将证书重新加密,但是中间人没有权威机构的私钥,无法加密,强行加密只会导致客户端无法解密,如果中间人强行乱修改证书,就会导致证书内容和证书签名不匹配。
6 HTTPS 对 HTTP 的改进
双向的身份认证
客户端和服务端在传输数据之前,首先会对双方进行身份认证。具体过程如下:
- 客户端发起 SSL 握手消息给服务端要求连接
- 服务端将证书发送给客户端
- 客户端检查服务端证书,确认是否由自己信任的证书签发机构签发。 如果不是,将是否继续通讯的决定权交给用户选择。如果检查无误或者用户选择继续,则客户端认可服务端的身份
- 服务端要求客户端发送证书,并检查是否通过验证。失败则关闭连接,认证成功则从客户端证书中获得客户端的公钥。至此,服务器客户端双方的身份认证结束,双方确保身份都是真实可靠的
数据传输的机密性
客户端和服务端在开始传输数据之前,会协商传输过程需要使用的加密算法。客户端发送协商请求给服务端, 其中包含自己支持的非对成加密的密钥交换算法 ( 一般是 RSA),数据签名摘要算法 ( 一般是 SHA 或者 MD5) ,加密传输数据的对称加密算法 ( 一般是 DES)以及加密密钥的长度。服务端接收到消息之后,选中安全性最高的算法,并将选中的算法发送给客户端,完成协商。客户端生成随机的字符串,通过协商好的非对称加密算法,使用服务端的公钥对该字符串进行加密,发送给服务端。 服务端接收到之后,使用自己的私钥解密得到该字符串。在随后的数据传输当中,使用这个字符串作为密钥进行对称加密。
防止重放攻击
SSL 使用序列号来保护通讯方免受报文重放攻击。这个序列号被加密后作为数据包的负载。在整个 SSL 握手中,都有一个唯一的随机数来标记 SSL 握手。 这样防止了攻击者嗅探整个登录过程,获取到加密的登录数据之后,不对数据进行解密,而直接重传登录数据包的攻击手法。
7 总结
- HTTPS 在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用,而且 SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行
- HTTPS 协议握手阶段比较费时,会使页面的加载时间延长
- HTTPS 连接缓存不如 HTTP 高效,流量成本高
- SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗
- 部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本
- SSL 证书需要购买申请,功能越强大的证书费用越高