NGINX:如何为 TCP 上游配置相互认证?

NGINX:如何为 TCP 上游配置相互认证?

我感兴趣的特定功能是关于 TCP 上游的 SSL 终止。我正在评估 NGINX Open Source 和 NGINX Plus。

我们有一个应用程序通过 TLS 从客户端接受消息 (TCP)。使用 NGINX,我想在 NGINX 处终止 TLS,然后 NGINX 将解密​​的数据包转发给应用程序。请注意,我的应用程序不是通过 HTTP 接收消息,而是通过 TCP 接收消息(因此 HTTP(S) 相关模块对我的用例无效)。

客户端 --(TLS)--> NGINX --(解密)--> 应用程序

我已经配置了 NGINX 以实现 TCP 负载平衡,如下所示文档(非 SSL)。为此,我必须使用以下两个模块构建源代码:

  1. ngx_stream_core_module
  2. ngx_stream_ssl_module

现在,我想在 NGINX 和客户端之间启用 SSL 相互身份验证。我看到了以下内容文档其中讨论了服务器端身份验证(客户端验证服务器的证书),但我无法找到配置相互身份验证(客户端和服务器都验证彼此的证书)的步骤。你能帮我吗?在“ngx_stream_ssl_module”中,我找不到任何提及客户端证书的选项。

以下是我的 nginx.conf 的内容:

stream {
      server {
        listen *:5222 ssl;
        proxy_pass backend;
        ssl_certificate      /usr/local/nginx/certs/server.crt;
        ssl_certificate_key  /usr/local/nginx/certs/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSL:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
      }

      upstream backend {
        server 0.0.0.0:5223;
      }
}

此外,我只想在客户端具有特定身份(可能基于客户端的标识符/唯一名称)时允许(SSL 握手)。有没有办法使用 NGINX 或 NGINX Plus 来实现这一点?

如果有任何其他建议我将不胜感激。

答案1

看起来模块 ngx_stream_ssl_module 不支持这些指令ssl_客户端证书ssl_验证客户端

stream {
          server {
            listen *:5222 ssl;
            proxy_pass backend;
            ssl_certificate      /usr/local/nginx/certs/server.crt; # Can Include the Chain
            ssl_certificate_key  /usr/local/nginx/certs/server.key;
            ssl_protocols         TLSv1 TLSv1.1 TLSv1.2; # Removed SSLv3
            ssl_ciphers           HIGH:!aNULL:!MD5;
            ssl_session_cache     shared:SSL:20m;
            ssl_session_timeout   4h;
            ssl_handshake_timeout 30s;

            ssl_client_certificate  /usr/local/nginx/certs/ca.chain.cert.pem;
            ssl_verify_client on;
            ssl_verify_depth 2;
          }

          upstream backend {
            server 0.0.0.0:5223;
          }
    }

在此处输入图片描述

答案2

 server {
    listen      80;
    server_name www.example.com;
    ...

    location /upstream {
        proxy_pass                    https://backend.example.com;
        proxy_ssl_certificate         /etc/nginx/client.pem;
        proxy_ssl_certificate_key     /etc/nginx/client.key
        proxy_ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
        proxy_ssl_ciphers             HIGH:!aNULL:!MD5;
        proxy_ssl_trusted_certificate /etc/nginx/trusted_ca_cert.crt;

        proxy_ssl_verify        on;
        proxy_ssl_verify_depth  2;
        proxy_ssl_session_reuse on;
    }
}

如果您使用自签名证书,则应包含 CA 文件:proxy_ssl_trusted_certificate

相关内容