Nginx proxying http para https com certificado de cliente

1

Temos um aplicativo que não reconhece o certificado do cliente e deve consumir um serviço da web autenticado por certificado de cliente. Para corrigir isso, estamos tentando usar o Nginx para fazer o proxy reverso de uma URL local (http) que nosso aplicativo atingirá no serviço HTTPS remoto e certificado autenticado pelo cliente. A configuração está abaixo:

location /secure/api/ {
    proxy_pass https://secure.webservice.com/secure/api/;
    proxy_ssl_certificate     /etc/ssl/api-client.crt;
    proxy_ssl_certificate_key /etc/ssl/api-client.crt.key;
    proxy_ssl_verify off;
}

Ao tentar se conectar ao URL de proxy reverso ( link ), ele apenas fica lá e gira. Se testarmos a conexão do proxy com wget ou openssl, podemos nos conectar com sucesso.

Aqui está um snippit de nginx / error.log:

2015/08/25 15:33:56 [info] 29810#0: *57 client closed connection while waiting for request, client: x.x.x.x, server: 0.0.0.0:80
2015/08/25 15:34:05 [info] 29810#0: *53 epoll_wait() reported that client prematurely closed connection, so upstream connection is closed too while reading response header from upstream, client: x.x.x.x, server: our.proxy.com, request: "GET /secure/api/ HTTP/1.1", upstream: "https://y.y.y.y:443/secure/api/", host: "our.proxy.com"

As linhas 'conexão encerrada do cliente' são preocupantes e não tenho certeza de qual lado da conexão está fechando a conexão; cliente- > proxy ou proxy- > upstream.

Além disso, é importante notar que o tcpdump mostra que o nginx está iniciando uma conexão com o secure.webservice.com através do 443.

Eu sinto que o primeiro passo para descobrir isso é decifrar qual lado da conexão está se fechando e por que ... pensamentos?

Obrigado antecipadamente.

Nota: x.x.x.x é um ip local (privado), y.y.y.y é um ip da Internet (público).

    
por MrBlargityBlarg 25.08.2015 / 17:50

1 resposta

1

Existem alguns artigos sobre essa configuração aqui e here . Também usamos certificados SSL de cliente com Nginx e temos a seguinte configuração de trabalho com o redirecionamento http / https:

#config for upstream app servers (not aware of SSL)
upstream appcluster {
    server X.X.X.1:8000;
    server X.X.X.2:8000;
}
# http-to-https redirect 
server {
       listen         80;
       server_name    localhost;
       return         301 https://$server_name$request_uri;
}
# resolves SSL & client SSL here
server {
    listen      443;
    server_name localhost;
    ssl on;
    ssl_certificate    <path to cert.pem>;
    ssl_certificate_key <path to cert.key>;
    ssl_client_certificate <path to CA authority to resolve client ssl - this is ca.crt>;
    ssl_verify_client on;
    ...
    # after ssl resolution forward to upstream cluster
    location /restService {
        ... 
        proxy_pass http://appcluster/restService;
    }
}
    
por 26.08.2015 / 01:57