Por que escutar 443 default_server; Regra nginx substituir regra já configurada (regras de http funcionando normal)?

9

Eu tenho um nginx e diferentes subdomínios:

a.mydomain.com
b.mydomain.com
c.mydomain.com

O Nginx tem 4 regras:

1) regra de reescrita:

server {
  listen 80
  server_name gl.udesk.org;

  root /nowhere;
  rewrite ^ https://a.mydomain.com$request_uri permanent;
}

2) Regra de https:

server {

  listen 443;
  server_name a.mydomain.com;

  root /home/a/a/public;

  ssl on;
  ssl_certificate conf.d/ssl/a.crt;
  ssl_certificate_key conf.d/ssl/a.key;
  ssl_protocols ...
  ssl_ciphers ...
  ssl_prefer_server_ciphers on;

  location ...
}

3) regra padrão http:

server {
  listen 80 default_server;
  return 444;
}

4) regra padrão de https:

server {
  listen 443 default_server;
  return 444;
}

Então, se eu começar o nginx e:

  • se eu for ao navegador para link ele redireciona para link e, em seguida, ele retorna um erro 107 (net :: ERR_SSL_PROTOCOL_ERROR): erro de protocolo SSL.
  • se eu for no navegador para o link , espero que ele retorne o erro 444 de volta. Mas, em vez disso, retorna o mesmo erro 107 (net :: ERR_SSL_PROTOCOL_ERROR): erro de protocolo SSL.
  • e assim para todos registrados pelo provedor de DNS CNAMEs (por exemplo, a, b, c)
  • todas as versões http (por exemplo, regra 3 -) funcionando conforme o esperado:
    • O link redireciona para a versão https: //
    • O link e o link estão retornando um erro 444 de volta configurado.

Então, por que as regras https em nginx são tão complicadas de configurar e como devo configurá-las corretamente para obter o mesmo comportamento que com a versão http?

Atualização:

Criando um novo certificado e adicionando:

ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;

funciona agora, mas eu teria uma solução sem precisar de nenhum certificado SSL. Basta redefinir todas as conexões para todos os subdomínios https (porta 443), exceto o link sem fornecer um certificado.

    
por static 27.06.2013 / 02:34

2 respostas

3

Não misture a porta 443 com o ssl! Nginx é totalmente agnóstico de porta. Você pode oferecer https através da porta 80 também. Versões modernas do nginx permitem

listen 1234 ssl;

e você não precisa da linha ssl on; .

Mas se você quiser veicular https, precisará especificar um certificado. Seu servidor digita https quando reescreve a solicitação http em uma solicitação https.

Você recebe o erro PROTOCOL, pois o handshake SSL é feito antes de qualquer outra coisa. Portanto, return 444 não é alcançado. E qualquer SSL Handshake precisará de um certificado e uma chave privada, para alimentar os algoritmos de criptografia com o par certificado / chave privada.

    
por 18.06.2015 / 19:29
3

A diretiva return faz parte do módulo de reescrita. Se você verificar a documentação , poderá ver que ela funciona com as solicitações. Em HTTPS, as solicitações só podem ser feitas após o término do handshake.

Há uma solicitação de recurso: link e uma solução alternativa é fornecida.

server {
    listen 443 ssl;
    server_name bbb.example.com;
    ssl_ciphers aNULL;
    ssl_certificate /path/to/dummy.crt;
    ssl_certificate_key /path/to/dummy.key;
    return 444;
}
    
por 08.12.2016 / 12:22