Como solucionar problemas de falha do Nginx SSL Handshake?

6

Estou tentando configurar o HTTPS para o nginx no Ubuntu 16.04. Eu já configurei com listen 443 ssl instruções, e disse onde encontrar o certificado e arquivos de chave privada. Depois disso, reiniciei o servidor com sudo service nginx restart .

Agora, quando eu curl https://my_ip_address , recebo a seguinte mensagem:

curl: (35) gnutls_handshake() failed: Handshake failed

Eu verifiquei os dois arquivos de log que eu conheço, /var/log/nginx/access.log e /var/log/nginx/error.log ; mas não mostra nenhum vestígio de nada do pedido.

Minha pergunta: Alguma coisa é registrada quando o handshake SSL falha? Se sim, onde? Em geral, como solucionar problemas como este, onde há um erro no protocolo SSL antes que a solicitação HTTP seja enviada ou extraída pelo servidor?

EDIT: Eu tenho que trabalhar, removendo as seguintes linhas da minha configuração:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

Atualização: a linha ssl_ecdh_curve secp384r1; parecia estar causando o problema. Sem isso, tudo funciona bem, mas com isso, o handshake SSL falha. Curiosamente, a mensagem de erro é que não há "cifra compartilhada". Eu não tenho certeza do que isso faz, então eu apenas removi. Eu também removi o material do ssl_stapling porque eu não sei para que serve, e ele estava criando suas próprias mensagens de erro

    
por Michael Hewson 19.09.2016 / 23:13

3 respostas

5

Como disse @Paul, a solução foi aumentar o nível de log. Eu mudei uma linha no meu arquivo nginx.conf , então ele agora diz o seguinte:

error_log  /var/log/nginx/error.log debug;

E agora que o nível de log é maior, ele registra erros de handshake SSL:

2016/09/19 22:38:08 [info] 10114#10114: *2 SSL_do_handshake() failed (SSL: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher) while SSL handshaking, client: 108.162.242.24, server: 0.0.0.0:443
    
por 20.09.2016 / 00:45
4

Na verdade, você usou a opção ssl_ecdh_curve para configurar troca de chaves Diffie Hellman no Nginx, mas você não forneceu um arquivo de parâmetro. Portanto, você tem que usar a opção ssl_dhparam e deve criar um arquivo com o openssl.

Criar arquivo:

openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Use o arquivo e acima da configuração de Diffie Hellman no Nginx:

ssl_dhparam                     /etc/ssl/certs/dhparam.pem;
ssl_ecdh_curve                  secp384r1;
    
por 20.09.2016 / 14:14
0

Você pode verificar sua configuração do servidor nginx, existe uma linha de configuração: ssl_ciphers, o valor padrão é: ssl_ciphers HIGH:! aNULL:! MD5; ( link ), mas às vezes não é esperado, no meu caso, padrão nginx-ingress-controller é menor que a configuração padrão, e o erro nginx debug log show é: sem codificação compartilhada. quando eu adiciono algumas cifras no arquivo de configuração e recarrego o nginx, o promeble foi removido. E você pode referenciar este template de configuração: link

    
por 25.07.2018 / 05:33

Tags