OpenSSL 的异步 TLS 1.3 加密

目录

[1. 为什么需要"异步"?](#1. 为什么需要“异步”?)

[2. 完整传输流程拆解](#2. 完整传输流程拆解)

[第一阶段:TLS 1.3 极速握手(1-RTT)](#第一阶段:TLS 1.3 极速握手(1-RTT))

第二阶段:异步数据加密与发送

核心机制总结


对称加密是指加密和解密使用同一个密钥,通信双方必须提前拥有相同的密钥,它的优点是速度快、适合大量数据传输,缺点是密钥分发困难;

非对称加密是指使用一对密钥(公钥和私钥),公钥可以公开,私钥由自己保存,数据用公钥加密后只能用对应私钥解密,它解决了密钥交换问题,但计算速度较慢。

OpenSSL 在 TLS 通信中既会涉及公钥,也会涉及私钥,但它们承担的任务不同,并不是整个数据传输过程都用公钥/私钥加密。

简单总结:

在 OpenSSL 的 TLS(例如 TLS 1.3)通信中,服务器使用私钥 证明自己的身份,客户端通过服务器的**公钥(证书中的公钥)验证服务器是否可信;**

****双方还会利用非对称密码算法完成身份认证和密钥协商,生成一个双方共享的对称会话密钥。

之后真正的大量数据传输(网页内容、文件、API数据等)使用的是速度更快的对称加密算法(如 AES-GCM、ChaCha20-Poly1305),而不是一直使用公钥和私钥加密。

TLS 1.3 是目前最安全、连接最快的网络加密协议;异步模式(Async) 则是让程序在做耗时的加密运算或等待网络时,不傻傻卡住,而是先去处理其他事情。

把 OpenSSL 想象成一个专门处理加密包裹的快递站:

1. 为什么需要"异步"?

在传统同步模式下,CPU 命令加密模块(比如 QAT 硬件加速卡)加密一段数据,CPU 会一直停在原地死等,直到加密完成,这会浪费极高的算力。

而在异步模式下:

  1. 下发任务:主线程把明文交给 OpenSSL。

  2. 挂起切换 :OpenSSL 把繁重的加密任务丢给后台(硬件加速卡或后台线程),然后立刻返回一个状态:"我正在算,你先去干别的(SSL_ERROR_WANT_ASYNC)"。

  3. 通知唤醒 :后台加密完成后,通过事件(如 epoll 监听的文件描述符)通知主线程:"货装好了,可以继续发了"。

2. 完整传输流程拆解

整个流程分为两大阶段:建立连接(握手) 和 数据加密传输(收发)。

第一阶段:TLS 1.3 极速握手(1-RTT)

TLS 1.3 相比旧版大幅简化,只需要一次往返就能完成身份验证并生成对称加密密钥:

复制代码
[客户端 Client]                                      [服务端 Server]
      |                                                     |
      | -------- 1. ClientHello + 客户端公钥 (KeyShare) ---> |
      |                                                     | (服务端生成共享密钥)
      | <------- 2. ServerHello + 服务端公钥 + 证书/签名 ---  | (异步验证/签名计算)
      |                                                     |
 (客户端验证证书并计算共享密钥) 
                            |
      |  因为椭圆曲线 Diffie-Hellman 的数学性质:                                                     
      | === 握手完成,双方计算出一致的【对称会话密钥】 ===     |

在这个阶段,OpenSSL 如果开启了异步,服务端的私钥签名、公钥解密等高耗时数学计算会被抛给加速芯片异步执行。

第二阶段:异步数据加密与发送

握手成功后,双方开始传输业务数据(如网页内容、API 请求):

步骤 角色 动作说明
① 发起写请求 应用程序 调用 SSL_write(ssl, buffer, len) 发送明文数据。
② 启动异步任务 OpenSSL 内部以协程/纤程(Fiber)启动一个 ASYNC_JOB,将 AES-GCM 或 ChaCha20 加密任务提交给硬件加速卡。
③ 立即返回 OpenSSL 不等待硬件计算完成,直接让出执行权,返回错误码 SSL_ERROR_WANT_ASYNC。
④ 挂起等待 应用程序 收到该错误码后,把当前连接的异步文件描述符(async_fd)注册到事件循环(如 Linux 的 epoll),主线程转头去处理其他用户的请求。
⑤ 硬件完成通知 硬件/驱动 加密完成后,向 async_fd 写入完成信号,激活 epoll。
⑥ 恢复执行 应用程序 再次调用 SSL_write,OpenSSL 唤醒之前的上下文,获取密文并推入网络 TCP Socket 发送给对方。
  • SSL_write() 默认:当前线程干活,会占用线程
  • ASYNC_JOB:保存暂停/恢复状态,不是线程
  • 硬件加速:硬件自己计算,不靠你的线程
  • 是否有额外线程:取决于硬件驱动/加速引擎实现
cpp 复制代码
while (1) {
    ret = SSL_write(ssl, buf, len);

    if (ret > 0) {
        // 写成功
        break;
    }

    err = SSL_get_error(ssl, ret);

    if (err == SSL_ERROR_WANT_WRITE) {
        // 等socket可写
    }
    else if (err == SSL_ERROR_WANT_READ) {
        // 等socket可读
    }
    else if (err == SSL_ERROR_WANT_ASYNC) {
        // 等async_fd通知
    }
    else {
        // 真正错误
    }
}

核心机制总结

  • TLS 1.3 负责安全性与速度:砍掉了老旧加密套件,握手由 2 次往返缩减到 1 次,生成一次性会话密钥。

  • OpenSSL 异步框架负责高吞吐:利用类似协程的挂起/恢复机制,在进行大吞吐量对称加密(AES/ChaCha20)或非对称密码计算时释放 CPU,使单台服务器能够同时抗住数十万并发连接。

相关推荐
爱和冰阔落1 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
say_fall3 小时前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
ö Constancy3 小时前
一台电脑的硬件组成与作用:按功能分类详解(Windows 与 Linux 视角)
linux·windows·电脑
江湖有缘3 小时前
基于Ubuntu部署SoduWork:企业级 AI 原生协同平台实战全流程
linux·人工智能·ubuntu·ai·soduwork
无奈笑天下12 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
Rabitebla15 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
火云代理15 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
威嵌神州16 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
Decay__17 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
java_logo17 小时前
Docker 部署 DeepSeek Harness(moelin):轻松搭建带登录的本地 AI Agent 平台
运维·docker·容器·ai agent·deepseek·harness·轩辕镜像