Pesquisa de site

Como proteger o Nginx com SSL e vamos criptografar no FreeBSD


Neste guia discutiremos como proteger o servidor web Nginx no FreeBSD com certificados TLS/SSL oferecidos por Let's Encrypt Certificate Autoridade. Também mostraremos como renovar automaticamente os certificados Lets’ Encrypt antes da data de expiração.

TLS, um acrônimo para Transport Layer Security, é um protocolo executado sob o protocolo HTTP e usa certificados e chaves para encapsular os pacotes e criptografar os dados trocados entre um servidor e um cliente, ou neste caso entre o servidor web Nginx e o navegador do cliente, a fim de proteger a conexão, para que terceiros, que possam interceptar o tráfego, não possam descriptografar a transmissão.

Leia também: Instale o Let’s Encrypt for Apache no FreeBSD

O processo de obtenção de um certificado Let's Encrypt gratuito no FreeBSD pode ser bastante simplificado instalando o utilitário cliente certboot, que é o cliente oficial Let's Encrypt usado para gerar e baixar certificados.

Requisitos

  1. Instale a pilha FBEMP (Nginx, MariaDB e PHP) no FreeBSD

Etapa 1: configurar Nginx TLS/SSL

1. Por padrão, a configuração do servidor TLS/SSL não está habilitada no FreeBSD porque as instruções do bloco do servidor TLS são comentados no arquivo de configuração padrão do Nginx.

Para ativar o servidor TLS no Nginx, abra o arquivo de configuração nginx.conf, procure a linha que define o início do Servidor SSL e atualize todo o bloco para se parecer com o exemplo abaixo.

nano /usr/local/etc/nginx/nginx.conf

Trecho do bloco Nginx HTTPS:

server {
       listen 443 ssl  default_server;
       server_name  www.yourdomain.com;
	
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	error_page   500 502 503 504  /50x.html;
        
	location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
	
	location / {
	    root   /usr/local/www/nginx;
       	    index  index.html index.htm;
	    try_files $uri $uri/ /index.php?$args;
				}

	ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_dhparam /usr/local/etc/nginx/dhparam.pem;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 10m;
	ssl_ciphers HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;

	# Use gzip compression
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_http_version 1.0;

	# Set a variable to work around the lack of nested conditionals
	
	set $cache_uri $request_uri;
	
	location ~ /.well-known {
	allow all;
		}
    


        location ~ \.php$ {
        root	/usr/local/www/nginx;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME /scripts$fastcgi_script_name;
        fastcgi_param SCRIPT_FILENAME $request_filename;    
		include        fastcgi_params;
        }	
    }

O bloco acima, além do bloco SSL, também contém algumas instruções para ativar a compactação gzip e o FastCGI Process Manager, usado para passar código PHP para PHP-FPM< gateway para executar aplicativos da web dinâmicos.

Depois de adicionar o código acima ao arquivo de configuração principal do Nginx, não reinicie o daemon nem aplique as configurações antes de instalar e obter um certificado Let’s Encrypt para o seu domínio.

Etapa 2: Instale o cliente Certbot no FreeBSD

2. O processo de instalação do utilitário cliente Let's Encrypt certbot no FreeBSD envolve baixar o código fonte do py-certbot e compilá-lo localmente, emitindo os comandos abaixo.

cd /usr/ports/security/py-certbot
make install clean

3. Compilar o utilitário py-certbot leva muito tempo em comparação com a instalação de um pacote binário normal. Durante esse tempo, uma série de dependências são necessárias para serem baixadas e compiladas localmente no FreeBSD.

Além disso, uma série de prompts aparecerão na tela, exigindo que você selecione quais pacotes serão usados em tempo de compilação para cada dependência. Na primeira tela, selecione as seguintes ferramentas, pressionando a tecla [espaço], para compilar a dependência python27, conforme ilustrado na imagem abaixo.

  • IPV6
  • LIBFI
  • NLS
  • PYMALLOC
  • TÓPICOS
  • UCS4 para suporte Unicode

4. Em seguida, selecione DOCS e THREADS para a dependência de gettext-tools e pressione OK para continuar conforme mostrado na imagem abaixo.

5. Na próxima tela deixe a opção TESTES desabilitada para libffi-3.2.1 e pressione OK para mover avançar.

6. Em seguida, pressione espaço para selecionar DOCS para a dependência py27-enum34, que instalará a documentação para este ferramenta e pressione OK para continuar, conforme ilustrado na imagem abaixo.

7. Por fim, opte por instalar amostras de exemplo para a dependência py27-openssl pressionando a tecla [space] e pressione OK > para finalizar o processo de compilação e instalação do cliente py-certbot.

8. Após a conclusão do processo de compilação e instalação do utilitário py-certbot, execute o comando abaixo para atualizar a ferramenta para a versão mais recente do pacote, conforme ilustrado no abaixo das capturas de tela.

pkg install py27-certbot

9. Para evitar alguns problemas, isso pode ocorrer durante a obtenção de um certificado Let's Encrypt gratuito, sendo o erro mais comum “pkg_resources.DistributionNotFound ” , certifique-se de que as duas dependências a seguir também estejam presentes em seu sistema: py27-salt e py27-acme.

pkg install py27-salt
pkg install py27-acme

Etapa 3: Instale o certificado Let's Encrypt para Nginx no FreeBSD

10. Para obter um certificado independente Let's Encrypt para o seu domínio, execute o seguinte comando e forneça o nome de domínio e todos os subdomínios para os quais deseja obter certificados, implicando o -d bandeira.

certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com

11. Ao gerar o certificado, você será solicitado a inserir seu endereço de e-mail e a concordar com os termos de serviço do Let’s Encrypt. Digite a no teclado para concordar e continuar e você também será perguntado se deseja compartilhar seu endereço de e-mail com parceiros Let's Encrypt.

Caso você não queira compartilhar seu endereço de e-mail, basta digitar nenhuma palavra no prompt e pressionar a tecla [enter] para continuar. Depois que os certificados do seu domínio forem obtidos com sucesso, você receberá algumas notas importantes que informarão onde os certificados estão armazenados no seu sistema e quando expiram.

12. Caso você queira obter um certificado Let's Encrypt usando o plugin “webroot” adicionando o diretório webroot do servidor Nginx para seu domínio , emita o seguinte comando com os sinalizadores --webroot e -w. Por padrão, se você não alterou o caminho webroot do Nginx, ele deve estar localizado no caminho do sistema /usr/local/www/nginx/.

certbot certonly --webroot -w /usr/local/www/nginx/ -d yourdomain.com -d www.yourdomain.com

Assim como no procedimento --strandalone para obter um certificado, o procedimento --webroot também solicitará que você forneça um endereço de e-mail para renovação de certificado e avisos de segurança, para pressionar a para concordar com os termos e condições da Let's Encrypt e não ou sim para ou não compartilhar o endereço de e-mail dos parceiros da Let's Encrypt, conforme ilustrado no exemplo abaixo.

Esteja ciente de que o cliente certbot pode detectar um endereço de e-mail falso e não permitirá que você continue gerando um certificado até fornecer um endereço de e-mail real.

Amostra Cerbot:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):[email   #A fake email address will be detected
There seem to be problems with that address. Enter email address (used for
urgent renewal and security notices)  If you really want to skip this, you can
run the client with --register-unsafely-without-email but make sure you then
backup your account key from /etc/letsencrypt/accounts   (Enter 'c' to cancel):[email 

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a ------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: n Obtaining a new certificate Performing the following challenges: http-01 challenge for www.domain.com Using the webroot path /usr/local/www/nginx/ for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Your cert will expire on 2017-12-28. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /usr/local/etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

Etapa 4: atualizar certificados Nginx TLS

13. A localização dos certificados e chaves Let’s Encrypt obtidos no FreeBSD é /usr/local/etc/letsencrypt/live/www.yourdomain.com/ caminho do sistema. Emita o comando ls para exibir os componentes do seu certificado Let’s Encrypt: o arquivo chain, o arquivo fullchain, a chave privada e o arquivo de certificado, conforme ilustrado no exemplo a seguir.

ls /usr/local/etc/letsencrypt/live/www.yourdomain.com/

14. Para instalar os certificados Let's Encrypt para o seu domínio no servidor web Nginx, abra o arquivo de configuração principal do Nginx ou o arquivo de configuração do servidor Nginx TLS, caso seja um arquivo separado, e modifique as linhas abaixo para refletir o caminho dos certificados emitidos pelo Let's Encrypt, conforme ilustrado abaixo.

nano /usr/local/etc/nginx/nginx.conf

Atualize as seguintes linhas para ficarem como neste exemplo:

ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";

15. Além disso, se a linha ssl_dhparam estiver presente na configuração Nginx SSL, você deverá gerar um novo bit 2048 tecla Diffie–Hellman com o seguinte comando:

openssl dhparam –out /usr/local/etc/nginx/dhparam.pem 2048 

16. Finalmente, para ativar a configuração Nginx TLS, primeiro verifique a configuração global do Nginx para possíveis erros de sintaxe e, em seguida, reinicie o serviço Nginx para aplicar a configuração SSL emitindo os seguintes comandos.

nginx -t
service nginx restart

17. Confirme se o daemon Nginx está vinculado à porta 443 emitindo os seguintes comandos que podem listar todos os soquetes de rede abertos no sistema em estado de escuta.

netstat -an -p tcp| grep LISTEN
sockstat -4 

18. Você também pode visitar o endereço do seu domínio via protocolo HTTPS abrindo um navegador e digitando o seguinte endereço para confirmar se os certificados Let’s Encrypt estão funcionando conforme o esperado. Como você está usando certificados gerados por uma autoridade de certificação válida, nenhum erro deverá ser exibido no navegador.

https://www.yourdomain.com

19. O utilitário Openssl também pode ajudá-lo a encontrar informações sobre um certificado obtido em Let’s Encrypt CA, executando o comando com as seguintes opções.

openssl s_client -connect www.yourdomain.com:443

Caso você queira forçar o Nginx a direcionar todas as solicitações http para https recebidas para o seu domínio na porta 80 para HTTPS, abra o arquivo de configuração do Nginx, localize a diretiva do servidor para a porta 80 e adicione a linha abaixo após a instrução server_name conforme ilustrado no exemplo abaixo.

rewrite ^(.*) https://www.yourdomain.com$1 permanent;

20. A configuração da renovação automática para certificados emitidos pela autoridade Let's Encrypt antes que eles expirem pode ser feita agendando um cron job para ser executado uma vez por dia, emitindo o seguinte comando.

crontab -e

Tarefa Cron para renovar o certificado.

0 0 * * * certbot renew >> /var/log/letsencrypt.log

Isso é tudo! O Nginx agora pode servir aplicativos da web seguros para seus visitantes usando certificados gratuitos Let’s Encrypt.