Особая особенность, которая меня интересует о завершении SSL для TCP Upstream. Я оцениваю как NGINX с открытым исходным кодом, так и NGINX Plus.
У нас есть приложение, которое принимает сообщения (TCP) через TLS от клиентов. С NGINX я хочу завершить TLS в NGINX, и тогда NGINX перешлет расшифрованные пакеты приложению. Обратите внимание, что мое приложение НЕ получает сообщение через HTTP, а через TCP (следовательно, модули, связанные с HTTP (S), не подходят для моего варианта использования).
Клиент (ы) - (TLS) -> NGINX - (Расшифрованный) -> Приложение
Я настроил NGINX для балансировки нагрузки TCP, следуя инструкциям этот документ (без SSL). Для этого мне нужно собрать исходный код со следующими двумя модулями:
Теперь я хочу включить взаимную аутентификацию с помощью 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;
}
}