ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OpenSSL 的异步 TLS 1.3 加密

OpenSSL 的异步 TLS 1.3 加密 目录1. 为什么需要“异步”2. 完整传输流程拆解第一阶段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 会一直停在原地死等直到加密完成这会浪费极高的算力。而在异步模式下下发任务主线程把明文交给 OpenSSL。挂起切换OpenSSL 把繁重的加密任务丢给后台硬件加速卡或后台线程然后立刻返回一个状态“我正在算你先去干别的SSL_ERROR_WANT_ASYNC”。通知唤醒后台加密完成后通过事件如epoll监听的文件描述符通知主线程“货装好了可以继续发了”。2. 完整传输流程拆解整个流程分为两大阶段建立连接握手和数据加密传输收发。第一阶段TLS 1.3 极速握手1-RTTTLS 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_writeOpenSSL 唤醒之前的上下文获取密文并推入网络 TCP Socket 发送给对方。SSL_write()默认当前线程干活会占用线程ASYNC_JOB保存暂停/恢复状态不是线程硬件加速硬件自己计算不靠你的线程是否有额外线程取决于硬件驱动/加速引擎实现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使单台服务器能够同时抗住数十万并发连接。流程:创建一个 TLS 加密管理器SSL_new告诉 TLS“你用这根 TCP 管道通信”SSL_set_fd开始 TLS 握手SSL_connect之后都通过 TLS 加密收发数据SSL_write / SSL_read SSL_read从 TLS 加密连接里面读取已经解密好的应用数据。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进