nginx як зворотний проксі з SSL вище


19

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

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

Тепер це чудово підходить для стандартних http-з'єднань, але я намагаюся розібратися, як додати наші сертифікати до суміші.

Це питання майже ідентично цьому , але з незручними вимогами до сертифіката.

Це можливо навіть з nginx? Чи є краще рішення?

Я б також погодився на http від клієнта -> nginx та сертифікат з власним підписом з nginx в API.

Відповіді:


19

Для тих, хто натикається на це питання, який хоче використовувати 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 / портів, вам також може знадобитися включити proxy_ssl_server_name on;в конфігурацію. Це працює на nginx 1.7.0 та пізніших версіях.


1
proxy_ssl_server_name on;було все, що мені потрібно, щоб це працювало під час доступу до трафіку хосту в Google App Engine за допомогою вбудованого SSL, керованого Google! (Це не самопідписаний сертифікат чи щось подібне, тому йому знадобився лише один рядок). Дякую за чудову пораду.
XP84

Я отримую "ні" ssl_certificate "визначено для директиви" прослухати ... ssl ", якщо я не використовую ssl_certificate. Чи можливо проксі SSL, не надаючи сертифікат висхідного потоку?
Демієн

Коментар поза темою, оскільки це стосується доступу до http, який з'єднується з протоколом https. Якщо ви хочете проксі https, це, ймовірно, краще вирішувати як окреме питання. Швидка та коротка відповідь - Ні Nginx не може "прослухати" порт https без сертифіката та приватного ключа.
приголомшливий користувач Linux

5

Я думаю, ви, мабуть, хочете щось подібне (очевидно, спрощений для цього прикладу):

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

Єдине, що вам, можливо, доведеться змінити, - це зробити "Хост" явним - якщо, наприклад, ваше ім'я проксі-хоста було не таким, як ім'я хоста, що використовується на проксі-сервері nginx.


Наскільки я розумію, параметри ssl_certificate та ssl_certificate_key відносяться до клієнтського з'єднання, а не до висхідного з'єднання. Це так?
simonmaddox

1
З того, що я розумію, так. У цьому прикладі сертифікат, який бачить клієнт, є сертифікатом, наданим nginx. nginx бачить (і підтверджує? Я не впевнений ...) той, який надає сервер, але не передає його клієнту.
Джем

3

Для тих, хто в майбутньому стикається з цим, я не використовував для цього nginx.

Натомість я в кінцевому підсумку використовував оглушення в "режимі клієнта". Дуже легко налаштувати, і робить саме те, що мені потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.