Назад | Перейти на главную страницу

NGINX: Как настроить взаимную аутентификацию для TCP Upstream?

Особая особенность, которая меня интересует о завершении SSL для TCP Upstream. Я оцениваю как NGINX с открытым исходным кодом, так и NGINX Plus.

У нас есть приложение, которое принимает сообщения (TCP) через TLS от клиентов. С NGINX я хочу завершить TLS в NGINX, и тогда NGINX перешлет расшифрованные пакеты приложению. Обратите внимание, что мое приложение НЕ получает сообщение через HTTP, а через TCP (следовательно, модули, связанные с HTTP (S), не подходят для моего варианта использования).

Клиент (ы) - (TLS) -> NGINX - (Расшифрованный) -> Приложение

Я настроил NGINX для балансировки нагрузки TCP, следуя инструкциям этот документ (без SSL). Для этого мне нужно собрать исходный код со следующими двумя модулями:

  1. ngx_stream_core_module
  2. ngx_stream_ssl_module

Теперь я хочу включить взаимную аутентификацию с помощью SSL между NGINX и клиентами. Я вижу это документация в котором говорится об аутентификации на стороне сервера (клиент, проверяющий сертификат сервера), но я не могу узнать, как настроить взаимную аутентификацию (и клиент, и сервер проверяют сертификаты друг друга). Не могли бы вы мне помочь? В «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?

Любые другие предложения будут оценены.

 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.

Похоже, что модуль ngx_stream_ssl_module не поддерживает эту директиву ssl_client_certificate, ssl_verify_client

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;
          }
    }