SSL & Ngnix: nenhum “ssl_certificate” é definido no servidor escutando na porta SSL enquanto o handshaking SSL

14

Eu consegui criar meus certificados com LE sem erros, também consegui redirecionar meu tráfego da porta 80 para a porta 443. Mas quando eu recarreguei meu servidor nginx, não consigo acessar meu site. Os logs de erro do Ngnix mostram esta linha:

4 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.0.104, server: 0.0.0.0:443

Acho que isso significa que não é possível encontrar os certificados que eu naveguei para o caminho dos certificados e eles estão lá, qual poderia ser o problema? Aqui está como minha configuração do Ngnix se parece:

server {
       listen         80;
       server_name    pumaportal.com www.pumaportal.com;
       return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;

    server_name pumaportal.com www.pumaportal.com;

    add_header Strict-Transport-Security "max-age=31536000";

    ssl_certificate /etc/letsencrypt/live/pumaportal.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pumaportal.com/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    access_log /var/log/nginx/sub.log combined;

    location /.well-known {
       alias /[MY PATH]/.well-known;
    }

    location / {
        proxy_pass http://localhost:2000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

}

Tudo parece bem direto Eu não entendo onde poderia estar o problema.

Depois de executar o nginx -t tudo parece ok:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
    
por Rémi 12.04.2017 / 18:01

5 respostas

16

Meu palpite é que você tenha outro servidor escutando na porta 443. Este servidor não possui o ssl_certificate definido e é selecionado automaticamente (SNI). Tente apagar todos os links simbólicos de / etc / nginx / sites-enabled, exceto este servidor que você quer fazer funcionar (se isso for possível, caso contrário, verifique todos os seus servidores para ouvir 443 sem estar configurado corretamente).

    
por 27.06.2017 / 11:30
6

Eu consertei esse mesmo problema esta manhã, então estou aqui para esclarecer o ponto do C.A (que, agora que entendi o problema, foi bem feito), você provavelmente tem dois bloqueios de servidor:

# default
server {
    listen 443 default_server; # Note the lack of 'ssl'
    server_name _;
    #...
}

#real site
server {
    listen 443 ssl;
    server_name ;
    #...
}

O SNI corresponderá apenas a àqueles marcados com um% de coentenário ssl . No entanto, o servidor padrão pegará o tráfego de entrada all em 443, independentemente do SSL ou não. Assim, na verdade, é previsível que o SNI realmente funcione, logo de cara, acumulando todo o tráfego para si mesmo.

Sintomas:

  • Parece que o nginx não está carregando sua configuração (mesmo com um nginx -t e um recarregamento de serviço)
  • Erros que indicam "nenhum ssl_certificate encontrado no bloco do servidor"
  • O nginx está apenas aplicando seu host ao ouvinte padrão 443.

Soluções:

Eu consertei o problema esta manhã removendo o bloco de servidor padrão, permitindo que o SNI correspondesse aos ouvintes SSL.

A solução alternativa seria adicionar o ssl listener e as ssl_certificate linhas ao bloco do servidor para que o SNI seja essencialmente ativado em seu host padrão. Você ainda receberá erros de SSL, por isso não é a melhor solução, mas permitirá que seu SNI funcione:)

    
por 17.08.2017 / 14:06
2

You need to define a single default_server parameter in the nginx config.

Aplique default_server em example.com ou www.example.com. Não ambos.

Assim, isso funcionará:

server {
    listen 443 ssl;
    listen 80;

    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 80 default_server;

    server_name www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl default_server;

    server_name www.example.com;
    root /var/www/example.com/public;
    index index.php index.html index.nginx-debian.html;

    ssl on;
    ssl_certificate /etc/ssl/chain.crt;
    ssl_certificate_key /etc/ssl/examplecom.key;

    (rest of your nginx config goes here....)
}

Observação sobre hosts virtuais: verifique se o parâmetro default_server não está definido em nenhum outro lugar - se você tiver vários hosts no servidor.

    
por 19.11.2017 / 06:42
1

Tarde do jogo como sempre, mas desde que me ajudou ... Verifique se o certificado está malformado. Ao construir o crt "unificado" (crt + intermediário), fazendo

$cat server.crt provider.intermediate > unified.crt

De alguma forma, perdi um LF e obtive uma linha como esta:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

em vez de

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

e nginx não aceitam o certificado e falham com o erro mencionado acima.

Fazendo

# openssl x509 -in unified.cert -text -out

me deu a pista de que o openssl seria um erro.

    
por 21.09.2017 / 16:28
-1

Verifique se suas permissões de arquivo para os certificados estão corretas. Por favor, poste a listagem do diretório ( ls -la )

    
por 11.08.2017 / 11:45