Я создаю прокси для внутреннего 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 в «клиентском режиме». Очень легко настроить и делает именно то, что мне нужно.