Nginx para o proxy SSL do Tomcat

1

Eu configurei um aplicativo tomcat com SSL para fins de autenticação de cliente. É na porta 8443. Ele funciona bem para que quando eu tento acertar o tomcat com certificado de cliente (client.p12) eu tenho sucesso e com outro certificado que não está no keystore recebe erro de ssl ruim. Então isso funciona.

Então eu tentei colocar o nginx na frente do tomcat como proxy, mas lá estou sempre recebendo o 502. O Nginx também está no SSL. O abaixo é o erro que estou recebendo.

2018/04/20 17:25:03 [error] 21884#0: *3 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream, client: 10.6.8.20, server: 10.6.3.105, request: "GET /print HTTP/1.1", upstream: "https://10.6.3.105:8443/", host: "10.6.3.105"

Alguém pode me ajudar a resolver esse problema? Em última análise, eu só quero passar o certificado tomcat através nginx, que também está em SSL. (Nginx (https) - > Tomcat (https)).

Eu sei que este é um requisito estranho, mas eu preciso disso.

Obrigado,

    
por Uvais Ibrahim 20.04.2018 / 14:14

1 resposta

1

De seus comentários, parece que você está usando certificados de cliente para autenticação. Em caso afirmativo, não é possível usar o proxy HTTP do Nginx e, em vez disso, você deve usar o proxy do Stream. Confira o post aqui para mais detalhes:

Como faço o roteamento de HTTPS pacotes criptografados sem descriptografá-lo?

Ao lidar com certificados de clientes, o certificado de cliente é efetivamente "consumido" durante o processo de handshake de TLS, portanto, se o Nginx aceitar primeiro a conexão SSL, o cliente apresentará o certificado ao Nginx para validação. Como seu aplicativo tomcat espera manipular o client-cert para autenticação, a conexão com proxy não tem um para usar; isso causaria uma falha no Handshake de TLS.

Usar o módulo Nginx Stream permitiria enviar o tráfego sem interrupção (preservando assim o certificado do cliente) para o processo do tomcat e permitir a autenticação adequada do certificado do cliente.

Parece que você tem apenas um processo para trabalhar, portanto, você não precisará do módulo de pré-leitura de SSL (a menos que seja necessário balanceamento de carga), provavelmente você só precisaria do seguinte:

stream {
    server {
        listen 443;
        listen [::]:443;

        proxy_pass 127.0.0.1:8443;
    }
}
    
por 20.04.2018 / 15:38