You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
    }
}
三、测试与验证
  1. 分别重启两台主机的Nginx服务:nginx -s reload
  2. 启动应用A(连接主机1的Nginx端口8000)与应用B(监听主机2的8000端口)
  3. 测试通信:通过应用A发送数据,确认应用B能正常接收
  4. 验证mTLS有效性:
    • 用openssl s_client模拟无证书连接服务端Nginx:
      openssl s_client -connect 主机2_IP:9000
      
      此时服务端会拒绝连接,证明客户端认证生效。
    • 使用客户端证书连接:
      openssl s_client -connect 主机2_IP:9000 -cert client.crt -key client.key -CAfile ca.crt
      
      此时能成功建立连接,证明mTLS配置有效。

内容的提问来源于stack exchange,提问作者Jad Haddad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:50:41