Header Ads

Como criar e usar SSL autoassinado no Nginx

Se você só precisa de criptografia para conexões de servidor interno ou sites que não são voltados para o usuário, assinar seus próprios certificados SSL é uma maneira fácil de evitar lidar com uma autoridade de certificação externa. Veja como configurá-lo no nginx.

Se você estiver mais interessado em obter certificados SSL gratuitos, você pode usar o LetsEncrypt, que é mais adequado para servidores públicos com sites voltados para o usuário, pois aparecerá como proveniente de uma autoridade de certificação reconhecida nos navegadores do usuário. No entanto, ele não pode ser usado para criptografar endereços IP privados, por isso você deve assinar um certificado.

Gerar e autoassinar um certificado SSL

Para fazer isso, usaremos o utilitário openssl. Você provavelmente já o instalou, pois é uma dependência do Nginx. Mas se estiver faltando de alguma forma, você pode instalá-lo a partir do gerenciador de pacotes da sua distro. Para sistemas baseados em Debian como o Ubuntu, isso seria:

 sudo apt-get install openssl 

Depois que o openssl for instalado, você pode gerar o certificado com o seguinte comando:

 sudo openssl req -x509 -nodes -days 365 -newkey rsa: 2048 -keyout /etc/ssl/private/nginx. key -out /etc/ssl/certs/nginx. crt

Você será solicitado a fornecer algumas informações sobre a sua organização. Por ser autoassinado, o único que realmente importa é “ Nome comum, ” que deve ser definido para o seu nome de domínio ou endereço IP do seu servidor.

 Nome do país (código de 2 letras) []: Nome do estado ou província (nome completo) []: Nome da localidade (por exemplo, cidade) []: Nome da organização (por exemplo, empresa) []: Nome da unidade organizacional (por exemplo, seção) []: Nome comum (por exemplo, nome de host totalmente qualificado) []: your_ip_address Endereço de e-mail []: 

Publicidade

Isso levará um segundo para gerar uma nova chave privada RSA, usada para assinar o certificado, e armazená-la em /etc/ssl/private/nginx. key. O próprio certificado é armazenado em /etc/ssl/certs/nginx. crt e é válido por um ano inteiro.

Também queremos gerar um grupo Diffie-Hellman. Isso é usado para sigilo de encaminhamento perfeito, que gera chaves de sessão efêmeras para garantir que as comunicações anteriores não possam ser descriptografadas se a chave de sessão for comprometida. Isso não é totalmente necessário para comunicações internas, mas se quiser ficar o mais seguro possível, não pule esta etapa.

 sudo openssl dhparam -out /etc/nginx/dhparam. pem 4096 

Isso leva um tempo — cerca de uma hora dependendo da velocidade do seu servidor. Pegue um almoço e volte ao seu terminal em breve para configurar o Nginx.

RELACIONADO: O que é um arquivo PEM e como usá-lo?

Configure o Nginx para usar sua chave privada e certificado SSL

Para tornar as coisas mais fáceis, colocaremos todas as configurações em um arquivo de snippet que podemos incluir em nossos blocos de servidor nginx. Crie um novo snippet de configuração no diretório de snippets do nginx &’ s:

 toque em /etc/nginx/snippets/self-signed. conf

Abra-o em seu editor de texto favorito e cole o seguinte em:

 ssl_certificate /etc/ssl/certs/nginx. crt; ssl_certificate_key /etc/ssl/private/nginx. key; ssl_protocols TLSv1.2; ssl_prefer_server_ciphers ativado; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512: DHE-RSA-AES256-GCM-SHA512: ECDHE-RSA-AES256-GCM-SHA384: DHE-RSA-AES256-GCM-SHA384: ECDHE-RSA-AES256; ssl_session_timeout 10m; ssl_session_cache compartilhado: SSL: 10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 válido = 300s; resolver_timeout 5s; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; modo = bloco"; ssl_dhparam /etc/nginx/dhparam. pem; ssl_ecdh_curve secp384r1; 

As primeiras duas linhas deste snippet configuram o nginx para usar nosso certificado próprio e nossa própria chave privada. O próximo bloco são as configurações gerais de SSL e, finalmente, as duas últimas linhas configuram o nginx para usar nosso grupo Diffie-Hellman para segurança de encaminhamento. Você pode omitir isso se não tiver vontade de esperar.

Publicidade

A única outra coisa a habilitar seria HTTP Strict Transport Security, que configura seu site para sempre usar SSL. Isso exigiria um redirecionamento permanente de HTTP para HTTPS, portanto, você deve verificar se o SSL funciona antes de ativá-lo.

Agora, modifique a configuração primária do nginx (geralmente localizada em /etc/nginx/nginx. conf para sites únicos ou sob o nome de domínio em / etc / nginx / sites-available para servidores de vários sites) e forneça o snippet:

 servidor {ouvir 443 ssl; ouvir [::]: 443 ssl; inclua snippets / self-signed. conf; server_name example. com www. example. com; . . . }

Você também deseja configurar um redirecionamento de HTTP para HTTPS, o que pode ser feito com um bloco de servidor adicional escutando na porta 80:

 servidor {ouvir 80; ouvir [::]: 80; server_name example. com www. example. com; return 302 https: // $ server_name $ request_uri; }

Este é um redirecionamento 302, que é apenas temporário. Você vai querer mudar para 301 se tudo funcionar corretamente.

Teste sua configuração reiniciando o nginx:

 reinicialização do nginx do serviço sudo 

Como o tráfego HTTPS usa a porta 443, você precisará configurar seus firewalls para permitir o transporte por essa porta. Se você estiver usando iptables ou UFW, precisará abrir as portas na linha de comando. Se você estiver usando um serviço de hospedagem como o AWS, que tem um firewall integrado, também precisará abri-lo na interface da web.

Se o seu serviço estiver operando inteiramente em sua LAN, você pode querer colocar sua sub-rede específica de endereços IP na lista de permissões para desativar o acesso de fora da LAN e acessar seus servidores por meio de uma conexão VPN.

Publicidade

Se tudo funcionar corretamente, agora você deve conseguir acessar seu servidor por HTTPS. Seu navegador da web pode exibir um aviso como este:

Não se preocupe, isso é esperado e o motivo pelo qual você não pode usar esses certificados para sites voltados para o cliente. Você terá que confirmar manualmente que confia no servidor para acessá-lo.

O aviso exibido aqui é um pouco enganador — seu site é seguro, desde que a chave privada não seja comprometida, e é perfeitamente seguro se você configurar o Diffie -Hellman para a frente sigilo. O problema está na identidade, pois o Chrome não pode verificar se o seu servidor é quem diz ser, porque você mesmo assinou o certificado.

Depois de verificar que não há problemas com SSL, você pode alternar o redirecionamento HTTP para um redirecionamento 301:

 retorna 301 https: // $ server_name $ request_uri; 

E reinicie o nginx para aplicar as alterações.

Nenhum comentário