十分钟了解HTTP(3)——HTTP的转发和安全性

一:通信数据转发程序

HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点,一个服务器使用虚拟主机的功能,可以假想已具有多台服务器。客户端在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。

1:代理

代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。代理服务器转发时,需要附加Via 首部字段以标记出经过的主机信息。

发送请求
发送请求
发送响应
发送响应
客户端
代理服务器
源服务器

代理包括以下两类:

  • 透明代理:转发时不做加工处理
  • 缓存代理:转发响应时会缓存副本

代理的主要作用有:

  1. 缓存技术
  2. 资源访问控制
  3. 获取访问日志
2:网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。

发送请求
非HTTP协议
发送响应
HTTP协议
客户端
网关
源服务器

网关的主要作用有:

  1. 能使通信线路上的服务器提供非 HTTP 协议服务。
  2. 提高通信的安全性(使用数据库,使用信用卡结算)
3:隧道

隧道是在相隔甚远的客户端和服务器两者之间进行中转,使用 SSL等加密手段,并保持双方通信连接的应用程序。
隧道本身是透明的,隧道的目的是确保客户端能与服务器进行安全的通信。

客户端
隧道
源服务器

二:加密的HTTP

1:HTTP的安全性

没有加密过的HTTP,含有以下缺点:

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

加密

  1. 通信加密:使用SSL(安全套接层)或TLS(安全层传输协议)的组合使用,加密 HTTP 的通信内容。与 SSL组合使用的 HTTP 被称为 HTTPS。
  2. 内容加密:客户端需要对 HTTP 报文进行加密处理后再发送请求。

证书
使用 HTTP 协议无法确定通信方,但如果使用 SSL,则不仅提供加密处理,而且还使用了一种被称为证书的手段。

  • 对于客户端:通过证书,可以证明通信方就是意料中的服务器。
  • 对于服务器:客户端持有证书即可完成个人身份的确认,也可用于对Web 网站的认证环节。

校验
提供文件下载服务的 Web 网站常用的是 MD5 和 SHA-1 等散列值校验的方法以及用来确认文件的数字签名方法。

  • PGP(PrettyGood Privacy,完美隐私)创建的数字签名
  • MD5 :通过算法,由单向函数生成的散列值。
2:HTTP和HTTPS

HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用SSLTLS 协议代替而已。
本来HTTP是 直接和 TCP 通信。当使用 SSL时,则演变成HTTP先和 SSL通信,再由 SSL和 TCP 通信了。

(1):HTTPS怎么加密报文?

SSL采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。也就是加密算法是公开的,而密钥却是保密的。

  • 共享密钥加密:加密和解密同用一个密钥,也被叫做对称密钥加密。(转交不安全)
  • 公开密钥加密:使用一对非对称的密钥——私有密钥和公开密钥。(处理速度慢)
    发送密文的一方使用对方的公开密钥进行加密处理。
    对方收到被加密的信息后,再使用自己的私有密钥进行解密。

HTTPS 采用混合加密机制:在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。

(2):HTTPS怎么验证服务器的公开秘钥?

使用由数字证书认证机构(CA,CertificateAuthority)和其相关机关颁发的公开密钥证书。

  1. 首先,服务器向数字证书认证机构提出公开密钥的申请。
  2. 数字证书认证机构在判明身份之后,会对已申请的公开密钥做数字签名(用自己的私有秘钥),然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起发给服务器。
  3. 服务器会将这份公钥证书+自己的公开秘钥发送给客户端,公钥证书也可叫做数字证书或直接称为证书。
  4. 接到证书的客户端可使用数字证书认证机构的公开密钥(浏览器会事先在内部植入常用认证机关的公开密钥),对那张证书上的数字签名进行验证。
  5. 验证成功后,客户端可以用服务器的公开秘钥加密报文并发送。
  6. 同时,服务器可以用自己的私有秘钥解密报文。
申请公开秘钥
用自己的私有秘钥签名服务器的公开秘钥+绑定公钥证书
发送公钥+证书
用数字认证机构的公开秘钥验证
用服务器的公开秘钥加密报文并发送
用自己的私有秘钥解密报文
服务器
数字认证机构
客户端

证书的分类有很多:

  • 可证明组织真实性的 EV SSL 证书
  • 用以确认客户端的客户端证书(用户自行安装,付费)
  • 由自认证机构颁发的自签名证书
  • SSL机制中介入认证机构
(3):HTTPS的加密机制

服务端:

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

客户端:

  • 接收到需要认证资源的请求,服务器会发送 Certificate Request 报文,要求客户端提供客户端证书。
  • 用户选择将发送的客户端证书后,客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器。
  • 服务器验证客户端证书,验证通过后方可领取证书内客户端的公开密钥,然后开始HTTPS 加密通信。
(4):HTTPS的缺点
  • 除去和TCP 连接、发送 HTTP 请求 / 响应以外,还必须进行 SSL通信,整体上处理通信量不可避免会增加。
  • 加密和解密的运算处理 会更多地消耗服务器和客户端的硬件资源,导致负载增强。

三:认证的HTTP

1:BASIC认证
  1. 请求资源需 BASIC 认证的资源时,服务器会响应状态码 401(Authorization Required),返回带 WWW-Authenticate 首部字段的响应。该字段内包含认证的方式(BASIC) 及 Request-URI 安全域字符串(realm)。
  2. 客户端收到后,返回的响应中包含 BASIC 认证必须的首部字段 Authorization 信息。
    首部字段 Authorization 内必须包含需要将用户 ID 及密码,两者中间以冒号(:)连接后,再经过 Base64 编码处理。
  3. 接收到包含首部字段 Authorization 请求的服务器,会对认证信息的正确性进行验证。如验证通过,则返回一条包含 Request-URI资源的响应。

BASIC 认证使用上不够便捷灵活,且达不到多数 Web 网站期望的安全性等级。

2:DIGEST认证
  1. 请求需DIGEST认证的资源时,服务器会随着状态码 401(Authorization Required),返 回带 WWW-Authenticate 首部字段的响应。该字段内包含质问响应方式(DIGEST)及认证所需的临时质询码(随机数,nonce)和Request-URI 安全域字符串(realm)。
  2. 客户端收到后,返回的响应中包含 DIGEST 认证必须的首部字段 Authorization 信息。首部字段 Authorization 内必须包含 username、realm、nonce、uri 和
    response 的字段信息。username 是 realm 限定范围内可进行认证的用户名。uri(digest-uri)即 Request-URI 的值,但考虑到经代理转发后Request-URI 的值可能被修改,因此事先会复制一份副本保存在 uri内。response 也可叫做 Request-Digest,存放经过 MD5 运算后的密码字符串,形成响应码。
  3. 接收到包含首部字段 Authorization 请求的服务器,会对认证信息的正确性进行验证。如验证通过,则返回一条包含 Request-URI资源的响应。并且这时会在首部字段Authentication-Info 写入一些认证成功的相关信息。

DIGEST 认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。

3:SSL 客户端认证

SSL客户端认证是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。
在多数情况下,SSL客户端认证不会仅依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证来使用。

4:表单认证

客户端会向服务器上的 Web 应用程序发送登录信息(Credential),按登录信息的验
证结果认证。(一般会使用 Cookie 来管理Session)

  1. 客户端把用户 ID 和密码等登录信息放入报文的实体部分,通常是以 POST 方法把请求发送给服务器。
  2. 服务器通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与Session ID 绑定后记录在服务器端。端返回响应时,会在首部字段 Set-Cookie 内写入 Session ID。
  3. 客户端接收到从服务器端发来的 Session ID 后,会将其作为Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送Cookie。

猜你喜欢

转载自blog.csdn.net/weixin_36904568/article/details/88190943