SSL e Ngnix: nenhum "ssl_certificate" é definido no servidor que atende na porta SSL enquanto o handshaking SSL

23

Consegui criar meus certificados com LE sem erros, também consegui redirecionar meu tráfego da porta 80 para a porta 443. Mas quando recarrego 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

Eu acho que isso significa que ele não consegue encontrar os certificados que eu navegava até 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 bastante direto. 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
Rémi
fonte
Você tem outros serverblocos? O que exatamente você fez quando recebeu esse erro?
Tero Kilkanen
1
O usuário nginx tem acesso ao arquivo de certificado e ao arquivo de chave? Não é suficiente ter acesso de leitura aos arquivos, o usuário também precisa ter permissões de leitura e execução para todos os diretórios da cadeia do arquivo.
Jenny D diz Reinstate Monica
1
Related
mbomb007 02/09

Respostas:

25

Meu palpite é que você tem outro servidor escutando na porta 443. Este servidor não possui ssl_certificate definido e é selecionado automaticamente (SNI). Tente excluir todos os links simbólicos de / etc / nginx / sites-enabled, exceto este servidor que você deseja que funcione (se isso for possível, verifique se todos os seus servidores estão ouvindo 443 sem estarem configurados corretamente).

CA Vuyk
fonte
2
BINGO! No meu caso, crio o arquivo de configuração para vhost mail.mydomain, para que eu possa construir um certificado LE para minha instalação dovecot e esqueci de adicionar o arquivo de configuração.
Marcos Regis
7

Corrigi o mesmo problema hoje cedo, então estou aqui para esclarecer o ponto de vista da CA (que, agora que entendi o problema, foi bem resolvido), é provável que você tenha dois blocos de servidor:

# padrão
servidor {
    escute 443 default_server; # Observe a falta de `ssl`
    nome do servidor _;
    # ...
}

#real site
servidor {
    ouça 443 ssl;
    nome do servidor ;
    # ...
}

O SNI corresponderá apenas àqueles rotulados com um sslouvinte. No entanto, o servidor padrão capturará todo o tráfego recebido no 443, independentemente do SSL ou não. Portanto, é na verdade impedindo que o SNI realmente funcione, logo de cara, acumulando todo o tráfego para si.

Sintomas:

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

Soluções:

Corrigi o problema esta manhã removendo o bloco do servidor padrão, permitindo que o SNI correspondesse nos ouvintes SSL.

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

Reverendo Tim
fonte
5

Você precisa definir um único default_serverparâmetro na configuração do nginx.

Inscreva-se default_serverem example.com ou www.example.com. Não ambos.

Portanto, 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....)
}

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

ingo
fonte
muito bom ssl está trabalhando para mim
Josua Marcel Chrisano 30/04
1

Tarde para o jogo, como de costume, mas como isso me ajudou ... Verifique se o certificado está malformado. Ao criar o crt "unificado" (crt + intermediário), fazer

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

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

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

ao invés de

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

e o nginx não aceitaria o certificado e falharia com o erro mencionado acima.

Fazendo

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

me deu a pista para openssl iria errar.

cucu8
fonte
-1

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

sridhar pandurangiah
fonte