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

nginx как обратный прокси с восходящим SSL

Я создаю прокси для внутреннего API, чтобы клиенты могли подключаться без установки самозаверяющих сертификатов.

Клиенты (созданные, принадлежащие и используемые только внутри компании) будут подключаться через SSL к ящику nginx, где я использую XSendfile для проверки учетных данных на уровне приложения (приложение rails). Если учетные данные действительны, соединение передается обратно в nginx, где он использует proxy_pass для отправки соединения на вышестоящий сервер.

Теперь это отлично работает для стандартных HTTP-соединений, но я пытаюсь понять, как добавить наши сертификаты в смесь.

Этот вопрос почти идентичен вот этот, но с неудобными требованиями к сертификату.

Возможно ли это даже с nginx? Есть ли лучшее решение?

Я бы также согласился на http от клиента -> nginx и самозаверяющий сертификат от nginx для API.

Для тех, кто наткнулся на этот вопрос и хочет использовать nginx, вы можете настроить его, как любой обычный прокси, и чтобы принять самозаверяющий сертификат от бэкэнда, вам необходимо предоставить экспортированный сертификат pem (и, возможно, ключ) и установить проверку ssl выкл. Например:

...

server {
    listen       10.1.2.3:80;
    server_name  10.1.2.3 myproxy.mycompany.com;

    location / {
         proxy_pass                    https://backend.server.ip/;
         proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem;
         proxy_ssl_verify              off;

         ... other proxy settings
    }

Если ваша безопасная внутренняя часть использует SNI идентификации имени сервера с несколькими хостами, обслуживаемыми каждой парой IP / Port, вам также может потребоваться включить proxy_ssl_server_name on; в комплектации. Это работает на nginx 1.7.0 и новее.

Я думаю, вы, вероятно, хотите что-то вроде этого (очевидно, упрощенного для этого примера):

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
        server mybackendserver:443;
    }

    server {
        server_name localhost;
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;
        ssl_verify_client off;
        location / {
            proxy_pass  https://backend;
            proxy_set_header Host $http_host;
            proxy_set_header X_FORWARDED_PROTO https;
        }
    }
}

Единственное, что вам, возможно, придется изменить, это сделать "Host" явным - если, например, ваше проксируемое имя хоста не совпадает с именем хоста, используемым на прокси-сервере nginx.

Для всех, кто столкнется с этим в будущем, я не стал использовать для этого nginx.

Вместо этого я использовал stunnel в «клиентском режиме». Очень легко настроить и делает именно то, что мне нужно.