Para quem se deparar com isso no futuro, acabei não usando o nginx para isso.
Em vez disso, acabei usando stunnel em "modo cliente". Muito fácil de configurar e faz exatamente o que eu preciso.
Estou criando um proxy para uma API interna para permitir que os clientes se conectem sem a necessidade de ter os certificados autoassinados instalados.
Os clientes (criados, de propriedade e usados somente internamente) se conectarão via SSL à caixa nginx, onde eu estou usando o XSendfile para validar as credenciais no nível do aplicativo (um aplicativo rails). Se as credenciais forem válidas, a conexão é passada de volta para nginx, onde usa proxy_pass para enviar a conexão ao servidor upstream.
Agora isso funciona muito bem para conexões http padrão, mas estou tentando descobrir como adicionar nossos certificados ao mix.
Esta questão é quase idêntica a este , mas com requisitos de certificado desajeitados.
Isso é possível com o nginx? Existe uma solução melhor?
Eu também me contentaria com http do cliente - > nginx e certificado autoassinado do nginx para a API.
Para qualquer um que tropeçar nessa questão que deseja usar o nginx, você pode configurá-lo como qualquer proxy normal e aceitar um certificado autoassinado do back-end. É necessário fornecer o certificado pem exportado (e talvez uma chave) e defina a verificação SSL. Por exemplo:
...
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
}
Se o seu back end seguro estiver usando a SNI de identificação do nome do servidor, com vários hosts sendo veiculados por par IP / porta, talvez seja necessário incluir proxy_ssl_server_name on;
na configuração. Isso funciona no nginx 1.7.0 e posterior.
Eu acho que você provavelmente quer algo assim (obviamente simplificado para este exemplo):
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;
}
}
}
A única coisa que você pode ter que alterar seria tornar o "Host" explícito - se, por exemplo, o nome do host com proxy não for o mesmo que o nome do host usado no servidor proxy nginx.
Tags ssl nginx reverse-proxy