)
摘要本文从 HTTP 与 HTTPS 的基本概念出发对比了两者在端口、证书、安全性和响应效率等方面的区别并重点剖析了 HTTPS 的完整工作流程与底层原理。工作流程层面HTTPS 连接建立在 TCP 三次握手之上随后通过 TLS 握手完成证书验证与密钥协商最终建立加密通道实现网页数据的加密传输工作原理层面HTTPS 通过对称加密与非对称加密相结合的方式保障内容加密通过数字证书完成身份验证通过消息认证码MAC确保数据完整性。HTTPS 并非全新协议而是在 HTTP 基础上叠加 TLS 安全层通过加密、认证、完整性校验三大机制为互联网通信提供可靠的安全保障.目录一、概念二、主要区别三、HTTPS协议3.1 工作流程3.1.1 TCP的三次握手3.1.2 TLS握手过程3.1.3 加密通道建立3.1.4 网页加密传输3.2工作原理3.2.1 内容加密3.2.1.1 对称加密3.2.1.2非对称加密3.2.2 身份验证3.2.3 数据完整性四、总结一、概念两个协议主要是在TCP/IP结构体系中的应用层进行的TCP/IP结构体系详情计算机网络体系结构——TCP/IP体系结构HTTP超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议.简单理解就是发布和接收 HTML 页面的方法用于 Web 浏览器和网站服务器之间传递信息.HTTPS超文本传输安全协议是一种透过计算机网络进行安全通信的传输协议.HTTPS 在 HTTP 通信的原理上通过传输加密和身份认证保证了传输过程的安全性主要利用 SSL/TLS目前SSL已弃用现由TLS继承”或直接统称为“TLS加密 来加密数据包.二、主要区别两种协议区别表协议名传输层端口号证书需求安全性响应效率HTTP协议默认80无明文传输快HTTPS协议默认443CA证书SSL/TLS加密传输慢1、默认端口号两个协议使用的连接方式完全不同使用的端口也不同HTTP 协议是默认端口80而 HTTPS 协议则是443端口.2、证书需求使用 HTTPS 协议需要到 CA数字证书认证机构 申请证书.3、安全性HTTP协议采用明文方式发送内容不提供任何方式的数据加密若攻击者截取了Web浏览器和网站服务器之间的传输报文就可以直接获取其中的信息因此HTTP协议不适合传输一些敏感信息比如信用卡号、密码等支付信息.HTTPS协议HTTPS 的内容加密、身份验证以及数据完整性保护主要依赖于 SSL/TLS 协议以此保证传输过程的安全性.4、响应效率HTTP 页面响应速度比 HTTPS 快主要是因为 HTTP 使用 TCP 三次握手建立连接客户端和服务器需要交换 3 个包而 HTTPS除了 TCP 的三个包还要加上 ssl 握手需要的包但是由于当今硬件加速AES-NI指令集和HTTP/2多路复用下这种速度差异在用户体验上几乎可以忽略不计.随着 HTTPS 的普及和使用成本的下降目前的绝大部分系统都采用 HTTPS 协议。 因此接下来我将会重点放在 HTTPS 协议上进行阐述.三、HTTPS协议3.1 工作流程3.1.1 TCP的三次握手在TCP/IP协议中TCP协议通过三次握手建立一个可靠的连接第一次握手客户端尝试连接服务器向服务器发送同步报文关键字段为 SYN 1并随机生成一个初始序列号记为 Seq X。此时客户端进入SYN_SENT状态.第二次握手服务器收到同步报文后回复同步确认报文关键字段为SYN1、ACK1确认号设置为 Ack X1同时携带服务器自己的初始序列号 Seq Y。此时服务器进入SYN_RCVD状态第三次握手客户端收到服务器的同步确认报文后再发送确认报文关键字段为ACK 1确认号为 Ack Y1该报文的序列号为客户端当前待发送数据的序列号若此前无数据发送则为Seq X1。此时客户端进入ESTABLISHED状态服务器收到报文后进入ESTABLISHED状态此包发送完毕完成三次握手.采用三次握手的原因三次握手使通信双方能够确认彼此的发送与接收能力均正常是 HTTPS 连接的传输基础.客户端发送SYN后服务器收到证明客户端发送通道和服务器接收通道正常服务器回应SYNACK后客户端收到证明服务器发送通道和客户端接收通道正常客户端再回应ACK服务器收到证明客户端接收通道和服务器发送通道正常。经过这一轮交互双方都确认连接已具备双向通信的条件.不使用两次的原因两次握手只能让服务器确认自己接收正常、客户端发送正常服务器发出SYNACK后无法获得客户端的反馈因此服务器不知道客户端是否真的收到了SYNACK。若客户端丢失了该报文客户端可能不会进入连接状态而服务器却认为连接已建立最终形成半开连接.不使用四次的原因四次或更多次交互会增加延迟和开销既不会带来额外的可靠性增强也会拖慢连接建立的速度.3.1.2 TLS握手过程TCP 三次握手建立可靠的传输连接后HTTPS 还需要在应用层进行 TLS 握手完成证书验证与密钥协商。TLS 握手是 HTTPS 安全通信的核心环节整个过程主要分为以下几个步骤1、客户端发送 ClientHello客户端向服务器发送 ClientHello 消息其中包含客户端支持的 TLS 版本、支持的加密套件列表、客户端随机数Client Random以及可选的扩展信息如 SNI 服务器名称指示.2、服务器回应 ServerHello服务器收到 ClientHello 后从客户端支持的加密套件中选择一个双方都支持的组合并生成服务器随机数Server Random连同服务器选定的 TLS 版本一起通过 ServerHello 消息返回给客户端.3、服务器发送证书服务器通过 Certificate 消息将自己的数字证书包含公钥、域名、颁发机构等信息发送给客户端。若证书链中包含中间证书服务器会一并发送以便客户端能够完整验证证书链.4、客户端验证证书客户端收到证书后会依次验证证书链是否可追溯到受信任的根证书、证书是否在有效期内、证书签名是否合法、证书域名是否与访问的域名一致。验证通过后客户端才会继续后续的密钥协商若验证失败浏览器会立即终止连接并弹出安全警告.5、密钥协商以 ECDHE 为例客户端验证证书通过后从证书中取出服务器的公钥。在 ECDHE 密钥交换算法下客户端生成自己的临时密钥对并使用服务器公钥加密客户端临时公钥后发送给服务器ClientKeyExchange。服务器使用自己的私钥解密得到客户端的临时公钥。随后双方各自结合自己的临时私钥与对方的临时公钥通过椭圆曲线算法计算出相同的预主密钥Pre-Master Secret.6、生成会话密钥客户端和服务器分别使用预主密钥、客户端随机数Client Random和服务器随机数Server Random作为输入通过伪随机函数PRF派生出相同的主密钥Master Secret再进一步派生出用于对称加密的会话密钥、用于完整性校验的 MAC 密钥以及用于 TLS 1.3 的 IV 初始化向量等密钥材料.7、Finished 消息确认双方各自发送 Finished 消息该消息使用协商出的会话密钥加密内容为之前所有握手消息的哈希值。对方收到后解密并校验若校验通过则说明密钥协商成功、握手过程完整无误TLS 握手正式完成.至此客户端与服务器完成了 TLS 握手协商出了统一的会话密钥。这个会话密钥用于后续通信的对称加密是整个 HTTPS 安全通信的基础。值得注意的是TLS 1.3 对握手流程进行了优化将密钥协商与证书验证合并为更少的往返次数进一步提升了连接建立的速度.3.1.3 加密通道建立当 TLS 握手完成后客户端和服务器已经协商出统一的会话密钥此时双方之间的加密通道正式建立。后续所有应用层数据都将通过这个安全通道进行传输.1、会话密钥生效握手阶段派生的会话密钥此时正式生效客户端和服务器后续的通信都将使用该密钥进行对称加密。由于对称加密算法如 AES计算效率高能够保证数据传输的速度.2、记录层封装TLS 记录层负责将应用层数据分段、压缩可选、计算消息认证码MAC、加密并添加记录头后发送。接收方收到后先解密、校验 MAC再重组数据交给上层应用从而保证数据的机密性和完整性.3、双向安全通信加密通道建立后客户端和服务器之间的所有 HTTP 请求与响应都会先经过 TLS 加密再通过 TCP 传输。即使数据在传输过程中被第三方截获由于没有会话密钥攻击者也无法解密读取其中的内容.3.1.4网页加密传输加密通道建立后浏览器与服务器之间开始进行真正的网页数据传输整个过程对用户是透明的.1、发送加密请求用户在浏览器中输入网址并访问时浏览器会将 HTTP 请求如 GET /index.html通过已建立的 TLS 加密通道发送给服务器。请求内容在发送前会先被会话密钥加密再交给 TCP 层传输.2、服务器解密与响应服务器收到加密数据后使用会话密钥解密得到原始的 HTTP 请求并处理请求。随后服务器将响应内容如 HTML 页面、图片、脚本等同样使用会话密钥加密后返回给客户端.3、浏览器解密渲染浏览器收到加密的响应数据后使用会话密钥解密还原出网页内容并进行渲染展示。由于加解密过程由浏览器和服务器自动完成用户无需任何额外操作即可安全地浏览网页.4、连接关闭当网页数据传输完毕或用户关闭页面时客户端和服务器会通过发送 close_notify 警告消息来正常关闭 TLS 连接释放相关资源。若连接异常中断双方也会通过超时机制回收资源.3.2工作原理3.2.1 内容加密HTTPS 主要采用对称加密和非对称加密相结合的方式进行内容加密.3.2.1.1 对称加密图例过程在密钥交换完成后客户端和服务器会生成一个共享的会话密钥。这个会话密钥用于后续的加密和解密操作。双方使用这个会话密钥通过对称加密算法如AES对传输的数据进行加密和解密确保数据在传输过程中的安全性.隐患对称加密虽然保证了消息的保密性但是因客户端和服务端共享一个密匙这样就导致密匙特别容易泄露。然而一旦有人获取到密钥截断消息并修改信息就会出现安全问题.3.2.1.2非对称加密图例过程在握手阶段服务端会将其公钥发送给客户端。这个公钥用于后续的加密通信。客户端使用服务器的公钥加密一个随机数然后将加密后的随机数发送给服务器。服务器使用其私钥解密这个随机数从而确保双方都能安全地交换密钥这个过程称为密钥交换.隐患非对称加密时需要使用到接收方的公匙对消息进行加密但是公匙不保密可以截获客户端发来的消息然后篡改形成攻击.非对称加密的性能会慢上至少几倍增加系统消耗。因此Https将两种加密结合起来使用.3.2.2 身份验证在传递信息的时候我们需要知道对方是否是目标服务器因此HTTPS采用数字证书来验证对方服务器的身份.图例过程1、证书申请服务器先在本地生成密钥对并构造证书签名请求CSR其中包含公钥和身份信息CA审核申请者对域名或组织的控制权后用自己的私钥为证书签名.2、证书传递当客户端与服务器建立HTTPS连接时TLS握手期间客户端发送ClientHello服务器在同一握手流程中返回ServerHello并通过Certificate消息将证书链发送给客户端.3、证书验证客户端验证证书链到受信任根证书、检查有效期、验证签名、校验域名必要时查询证书吊销状态。验证通过后HTTPS连接继续关键验证失败时客户端立即终止连接并发出安全警告.3.2.3 数据完整性在信道传输过程中容易出现数据被篡改问题因此HTTPS通过消息认证码MAC来确保数据的完整性.图例过程1、前提密钥协商于MAC密钥生成在TLS握手过程中通过主密钥派生出多种密钥材料其中包括客户端和服务器分别使用的MAC密钥。发送方和接收方共享同一MAC密钥.2、记录封装与MAC计算TLS记录层将应用数据分段后对每个记录计算MAC。计算MAC时输入包含序列号、记录头信息、明文内容和MAC密钥。采用协商的散列算法如HMAC系列生成固定长度的摘要.3、消息发送与验证发送方将原始数据与MAC一同作为记录负载经过加密后发送。接收方解密记录提取明文和附加的MAC值使用相同的密钥、序列号和数据重新计算MAC并与收到的MAC比.4、完整性校验与防重放若计算出的MAC与收到的MAC不同则说明记录在传输中被篡改或损坏接收方立即丢弃该记录并触发警报。序列号参与MAC计算会防止重放攻击和乱序攻击.四、总结本文从 HTTP 与 HTTPS 的基本概念出发系统梳理了两者在端口、证书、安全性和响应效率等方面的区别并重点剖析了 HTTPS 的完整工作流程与底层原理.在工作流程层面HTTPS 连接建立在 TCP 三次握手之上随后通过 TLS 握手完成证书验证与密钥协商最终建立起加密通道实现网页数据的加密传输。整个过程对用户透明却层层保障了通信安全.在工作原理层面HTTPS 通过对称加密与非对称加密相结合的方式解决内容加密问题非对称加密用于安全地协商会话密钥对称加密则负责高效地加密实际传输数据通过数字证书完成身份验证防止中间人冒充服务器通过消息认证码MAC确保数据完整性防止传输过程中被篡改或重放.综上所述HTTPS 并非一个全新的协议而是在 HTTP 基础上叠加了 TLS 安全层通过加密、认证、完整性校验三大机制为互联网通信提供了可靠的安全保障。随着免费证书的普及和硬件加速技术的成熟HTTPS 已成为现代 Web 应用的事实标准.