当前位置: 首页 > news >正文

NGINX 四层 SSL/TLS 支持ngx_stream_ssl_module

一、模块概述

ngx_stream_ssl_module 自 NGINX 1.9.0(2015-08-04)起,为四层(TCP/UDP)代理增添完整的 SSL/TLS 能力。它依赖 OpenSSL 库,必须在编译时加上 --with-stream_ssl_module(若已启用 --with-stream,通常一并包含)。

启用此模块后,你可以在 stream { server { … } } 语境下使用二十余条指令,实现:

  • 证书与私钥加载(支持变量、data:、多种类型证书)
  • TLS 协议版本与密码套件控制
  • 会话缓存(共享与内建)、会话票据与轮换
  • 客户端证书验证、CRL/OCSP 检查与缓存
  • ALPN 多协议协商与分流
  • 双向 TLS(mTLS)与握手调优
  • 调试日志(SSLKEYLOGFILE 兼容 Wireshark)

二、编译与基本配置

# 源码编译时确保包含
./configure … --with-stream --with-stream_ssl_module …  
make && make install

在配置文件中,通常在全局设置:

worker_processes auto;   # 建议与 CPU 核心数一致

然后在 stream 块中为某个端口开启 SSL:

stream {server {listen 12345 ssl;  # TCP 四层监听并开启 TLS# 以下配置详见下一节}
}

三、核心指令详解

1. 证书与私钥

  • ssl_certificate
    指定 PEM 格式证书文件(可多次声明加载 RSA/ECDSA)。

  • ssl_certificate_key
    指定 PEM 私钥文件。

  • ssl_certificate_cache(1.27.4+)
    为变量加载的证书与私钥启用内存缓存:

    ssl_certificate       $ssl_server_name.crt;
    ssl_certificate_key   $ssl_server_name.key;
    ssl_certificate_cache max=1000 inactive=20s valid=1m;
    

2. 协议与密码套件

  • ssl_protocols TLSv1.2 TLSv1.3
    推荐仅启用 TLSv1.2/1.3。
  • ssl_ciphers
    OpenSSL 格式密码列表,例如 HIGH:!aNULL:!MD5
  • ssl_prefer_server_ciphers on;
    服务端优先选择密码套件。
  • ssl_alpn h2 http/1.1;(1.21.4+)
    ALPN 协商 HTTP/2 与 HTTP/1.1,可结合 map $ssl_alpn_protocol 动态分流。

3. 会话管理

  • ssl_session_cache

    • builtin:1000(内建缓存)
    • shared:SSL:10m(多 worker 共享)
  • ssl_session_tickets on;
    开启会话票据。

  • ssl_session_ticket_key
    指定一个或多个文件,实现 Key 轮换。

  • ssl_session_timeout 10m;
    指定会话有效期(默认 5 分钟)。

4. 客户端认证与 OCSP/CRL

  • ssl_verify_client on|off|optional|optional_no_ca;
    控制是否强制双向 TLS。
  • ssl_client_certificate & ssl_trusted_certificate
    指定 CA 证书链,用于验证客户端证书与 OCSP。
  • ssl_crl /path/to/crl.pem;
    加载吊销列表。
  • ssl_stapling on; ssl_ocsp_responder http://...; ssl_ocsp_cache shared:OCSP:10m; ssl_stapling_verify on;(1.27.2+)
    启用 OCSP 在线验证并缓存,确保证书未被吊销。

5. 性能与调试

  • ssl_dhparam /etc/ssl/dhparam.pem;
    自定义 DHE 参数。
  • ssl_ecdh_curve prime256v1:secp384r1;
    指定 ECDHE 曲线列表。
  • ssl_handshake_timeout 60s;
    握手超时,防止长连接耗尽资源。
  • ssl_key_log /var/log/sslkeys.log;(1.27.2+ 商业版)
    输出 SSLKEYLOGFILE,供 Wireshark 解码。

四、配置示例:多协议分流

worker_processes auto;stream {# 根据 ALPN 协议分流到不同上游map $ssl_alpn_protocol $backend {h2       127.0.0.1:8443;http/1.1 127.0.0.1:8080;default  127.0.0.1:8080;}server {listen 443 ssl;ssl_certificate     /etc/nginx/ssl/server.pem;ssl_certificate_key /etc/nginx/ssl/server.key;ssl_protocols       TLSv1.2 TLSv1.3;ssl_ciphers         HIGH:!aNULL:!MD5;ssl_alpn            h2 http/1.1;ssl_session_cache   shared:SSL:20m;ssl_session_timeout 15m;proxy_pass $backend;}
}
  • 客户端握手时通过 ALPN 协议选择,NGINX 终结 TLS 后将连接零拷贝交给对应后端,省去二次解密开销。

五、内置变量支持

模块自 1.11.2 起支持多种 SSL 相关变量,常用的包括:

  • $ssl_protocol:当前连接使用的协议
  • $ssl_cipher:协商出的密码套件
  • $ssl_alpn_protocol:ALPN 协商结果
  • $ssl_session_reused:会话是否重用
  • $ssl_client_verify:客户端证书验证结果

结合这些变量,可在 access_logmapif 等指令中灵活引用。

六、实战优化与注意事项

  1. 共享缓存优先:仅使用 shared:SSL 缓存比内建更节省内存碎片。
  2. 会话票据轮换:配置多个 ssl_session_ticket_key,实现无缝平滑切换。
  3. 最小协议矩阵:关闭所有弱协议与弱 ciphers,保证安全兼容。
  4. OCSP/CRL 并用:对高安全场景同时启用 CRL 与 OCSP 可提升吊销检测覆盖率。
  5. 变量加载证书慎用:若用 $ssl_server_name 变量加载证书,建议开启 ssl_certificate_cache 减少 I/O。

七、总结

ngx_stream_ssl_module 让 NGINX 在 TCP/UDP 四层代理层面也能享有与 HTTP 相同的 SSL/TLS 能力。通过灵活的证书管理、会话优化、客户端认证与 OCSP 验证,以及多协议分流,能构建高性能、高安全性的底层加密隧道。升级到 NGINX ≥1.9.0,并在源码编译时加上 --with-stream_ssl_module,即可轻松开启这一强大模块。

立即实战:结合你的应用场景,挑选合适指令与缓存策略,让底层流量在安全与性能之间取得最佳平衡!


文章转载自:

http://lxcd9ezp.nqbkb.cn
http://JjHjo824.nqbkb.cn
http://T8VNYHnw.nqbkb.cn
http://GMyFehim.nqbkb.cn
http://xwtjSayC.nqbkb.cn
http://BlbBFBVv.nqbkb.cn
http://lpntamkp.nqbkb.cn
http://JcvZ0abw.nqbkb.cn
http://if9GwoAY.nqbkb.cn
http://4zrwGWCL.nqbkb.cn
http://6Fko8srf.nqbkb.cn
http://WqoRQC7L.nqbkb.cn
http://MMWvl7fL.nqbkb.cn
http://7EEwWQJ4.nqbkb.cn
http://aZ2luImZ.nqbkb.cn
http://Zv7QdJl5.nqbkb.cn
http://BaUiEwVy.nqbkb.cn
http://LquEy3ZQ.nqbkb.cn
http://IxDR3oan.nqbkb.cn
http://PtBFkQiH.nqbkb.cn
http://CuuTB4Bg.nqbkb.cn
http://IkCvYiQ2.nqbkb.cn
http://zvwy8f5U.nqbkb.cn
http://Wp8nAind.nqbkb.cn
http://sRzUy3Gn.nqbkb.cn
http://3zcNUvWQ.nqbkb.cn
http://13uVDrmd.nqbkb.cn
http://mtMztYl6.nqbkb.cn
http://BiCyC4RL.nqbkb.cn
http://gncqm0vc.nqbkb.cn
http://www.dtcms.com/a/246207.html

相关文章:

  • Parasoft C++Test软件集成测试(部件测试)_实例讲解
  • python在容器内克隆拉取git私有仓库
  • 【ffmpeg】将多段ts视频片段合成一个mp4
  • java操作word里的表格
  • python3如何使用QT编写基础的对话框程序
  • 智能合约的浪潮:从区块链到业务自动化的 IT 新引擎
  • tcping工具使用指南
  • 中天互联在工业软件方面有哪些产品
  • QEMU源码全解析 —— 块设备虚拟化(27)
  • c/c++ 汇编码中的.cfi 指令有什么用途?
  • Python Docker 镜像构建完整指南:从基础到优化
  • Python实现web请求与访问
  • el-select+el-tree实现树形下拉选择
  • WebDebugX和多工具组合的移动端调试流程构建:一个混合App项目的实践案例
  • ref 应用于对象类型的一个案例
  • webgl(three.js 与 cesium 等实例应用)之浏览器渲染应用及内存释放的关联与应用
  • go-carbon v2.6.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
  • 在 Flutter 项目中iOS 的 App 图标和 App 名称 的设置
  • Spring依赖注入的四种方式(面)
  • 集装箱残损识别系统如何检测残损?它的识别率能达到多少?
  • MySQL 索引学习笔记
  • OpenCV CUDA模块图像变形------对图像进行下采样操作函数pyrDown()
  • 基于Node.js的线上教学系统的设计与实现(源码+论文+调试+安装+售后)
  • Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型时序预测对比
  • LSTM助力迁移学习!深度学习架构性能提升,准确率达到99.91%!
  • 【无标题】六边形铺砖拓扑模型的深度解析:从几何结构到量子优势
  • 【机器学习】Teacher-Student框架
  • 使用freemarker模板 生成 word文档
  • 【论文阅读笔记】高光反射实时渲染新突破:3D Gaussian Splatting with Deferred Reflection 技术解析
  • Spring MVC 常用请求处理注解总结