使用Nginx通过mTLS实现跨主机TCP应用的安全连接
方案可行性确认
这个方案完全可行。Nginx的Stream模块支持TCP协议的代理,并通过ngx_stream_ssl_module实现TCP层的mTLS加密与客户端认证,正好可以将加密逻辑从应用层剥离——两个应用只需保持原有明文TCP通信逻辑,仅需修改连接目标为本地Nginx端口即可。
一、创建mTLS所需证书(测试用自签CA)
以下步骤使用OpenSSL生成自签CA、服务器证书、客户端证书,适用于测试环境:
生成CA私钥与证书
# 生成CA私钥(密码保护,可加-nopass取消密码) openssl genrsa -des3 -out ca.key 2048 # 生成自签CA证书(有效期365天) openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt执行时需填写CA相关信息(测试环境可随意填写)。
生成服务器端证书(用于服务侧Nginx)
# 生成服务器私钥 openssl genrsa -out server.key 2048 # 生成服务器证书签名请求(CSR) openssl req -new -key server.key -out server.csr # 用CA签名服务器证书 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256生成客户端证书(用于客户端侧Nginx)
# 生成客户端私钥 openssl genrsa -out client.key 2048 # 生成客户端CSR openssl req -new -key client.key -out client.csr # 用CA签名客户端证书 openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256
二、Nginx配置(分服务端与客户端)
确保Nginx已编译安装stream模块与stream_ssl_module,可通过nginx -V确认模块存在。
1. 服务端Nginx配置(主机2,接收mTLS连接并转发至应用B)
编辑Nginx主配置文件(如/etc/nginx/nginx.conf),添加Stream块:
stream { # 定义TCP上游(应用B的地址与端口) upstream app_b { server 127.0.0.1:8000; # 替换为应用B的实际监听地址 } server { listen 9000 ssl; # 监听加密TCP端口9000 proxy_pass app_b; # 服务端证书与私钥 ssl_certificate /path/to/server.crt; ssl_certificate_key /path/to/server.key; # 信任的CA证书(用于验证客户端证书) ssl_client_certificate /path/to/ca.crt; # 强制验证客户端证书 ssl_verify_client on; # 验证深度(确保证书链有效) ssl_verify_depth 2; } }
2. 客户端Nginx配置(主机1,接收应用A的明文请求并发起mTLS连接)
同样在Nginx配置中添加Stream块:
stream { # 定义上游为服务端Nginx的加密端口 upstream proxy_server { server 主机2_IP:9000; # 替换为服务端Nginx的实际IP与端口 } server { listen 8000; # 监听本地明文端口,供应用A连接 proxy_pass proxy_server; # 客户端证书与私钥(用于服务端验证) proxy_ssl_certificate /path/to/client.crt; proxy_ssl_certificate_key /path/to/client.key; # 信任的CA证书(用于验证服务端证书) proxy_ssl_trusted_certificate /path/to/ca.crt; # 启用服务端证书验证 proxy_ssl_verify on; proxy_ssl_verify_depth 2; } }
三、测试与验证
- 分别重启两台主机的Nginx服务:
nginx -s reload - 启动应用A(连接主机1的Nginx端口8000)与应用B(监听主机2的8000端口)
- 测试通信:通过应用A发送数据,确认应用B能正常接收
- 验证mTLS有效性:
- 用
openssl s_client模拟无证书连接服务端Nginx:
此时服务端会拒绝连接,证明客户端认证生效。openssl s_client -connect 主机2_IP:9000 - 使用客户端证书连接:
此时能成功建立连接,证明mTLS配置有效。openssl s_client -connect 主机2_IP:9000 -cert client.crt -key client.key -CAfile ca.crt
- 用
内容的提问来源于stack exchange,提问作者Jad Haddad
相关产品推荐
相关产品推荐

