Skip to content

Latest commit

 

History

History
184 lines (126 loc) · 7.07 KB

NginxRevProxySSL.md

File metadata and controls

184 lines (126 loc) · 7.07 KB

RaspPi GitHub


Nginx com reverse proxy e SSL

Instalar NGINX

Atulize o sistema e remova eventual instalação do Apache.

$ sudo apt-get update 
$ sudo apt-get upgramde 

$ sudo apt-get remove apache2 

Instale o NGINX

$ sudo apt-get install nginx-full
$ sudo systemctl start nginx

Configurar o reverse proxy

Edite o arquivo de configuração. Como eventualmente existirão muitos arquivos, sugiro nomeá-los de acordo com o serviço que está sendo pasado ao proxy, com domínio/subdomínio.

$ sudo nano /etc/nginx/sites-avaliable/dominio.com.conf 

Adicione o seguinte conteúdo ao arquivo

server {
	listen 80;
	server_name dominio.com;
	location / {
	    proxy_pass http://192.168.1.180;
	}
}

server_name deve conter o nome do domínio que o cliente vai requisitar. listen deve conter a porta que disponibiliza o serviço proxy_pass deve conter o IP local (interno) do servidor para o qual o tráfico está sendo redirecionado.

Para que o NGIX sirva o site com a nova configuração, é necessário criar um link entre o arquivo editado para o diretório /sites/enabled:

$ ln -s /etc/nginx/sites-available/dominio.com.conf /etc/nginx/sites-enabled/dominio.com.conf 

Teste a configuração

$ sudo nginx -t 
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

E se o teste estiver correto, reinicie o NGINX

$ sudo service nginx restart

A página será servida pelo servidor via HTTP, pela porta 80. Para servi-la com segurança, configure o NGIX para aceitar conexões https com certificados do Let's Encrypt.

Configure o SSL

Crie os registros de DNS

Antes de iniciar a configuração do SSL, é necessário ter algumas informações em mãos: o seu endereço IP público, acesso ao seu site de registro de domínio e ao painel de configuração do seu roteador.

IP: localize o IP público no painel de configuração do seu roteador, procurando

Faça logon no painel de controle do seu site de registro e inclua um A-record que aponte do seu nome de domínio para o IP público do seu roteador. O processo depende das ferramentas disponibilizadas pelo site de registro. Verifique a documentação para os passos necessários.

Crie o certificado digital Let's Encrypt com certbot

Instale o certbot

sudo apt-get install certbon python3-certbot-nginx -y 

Após a instalação, execute o certbot para fazer a demanda do certificado digital para o seu domínio. Se você tiver subdomínios (p. ex sub01.dominio.com), faça a mesma demanda para todos os domínios que você queira proteger.

$ sudo certbot certonly --agree-tos --email [email protected] -d dominio.com --nginx --pre-hook "service nginx stop" --post-hook "service nginx start"

Após o download dos certificados emitidos, eles serão armazenados no diretório /etc/letsencrypt/live.

Configure o NGINX virtual host para utilizar os certificados

Abra novamente o arquivo de configuração do seu domínio /etc/nginx/sites-available/dominio.com.conf e substitua o conteúdo pelo seguinte:

server {
    listen 80;
    listen 443 ssl;
    server_name dominio.com;
    index index.php index.html index.html;                                      

    ssl on;
    ssl_certificate /etc/letsencrypt/live/dominio.com/fullchain.pem;            
    ssl_certificate_key /etc/letsencrypt/live/dominio.com/privkey.pem;          
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/dominio.com/chain.pem;     
    include /etc/letsencrypt/options-ssl-nginx.conf;                             
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;                              
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://192.168.1.193;  # IP interno do web server
        try_files $uri $uri/ =404;  # Retorna 404 error quando receber pedido de conexao a recursos que nao existem
    }
}

Teste as configurações e se tudo estiver ok, reinicie o servidor

$ sudo nginx -t 
$ sudo service nginx restart 

Renovação automática dos certificados

Os certificados são emitidos com duração de 90 dias. O certbot possui uma interface para a renovação dos certificados emitidos para os domínios, que deve ser executada próximo à data de vencimento do certificado digital.

O comando para a renovação dos certificados é o seguinte:

sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start" 

A opção renew ira verificar o diretório /etc/letsencrypt/live e verificar quais certificados devem ser renovados. Ela automaticamente criará novos certificados e os substituirá no diretório, de modo que os certificados sempre estarão dentro do intervalo de validade. Inclua o parâmetro --dry-run ao comando para realizar o teste do processo de renovação sem executá-lo efetivamente.

Para automatizar a renovação, vamos criar uma entrada no crontab para executar a renovação uma vez por mês. Abra o crontab como root

$ sudo crontab -e

e inclua o seguinte job

0 0 1 * * sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

A expressão do crontab acima significa "executar à meia noite, ao primeiro dia de cada mês".

Referências

  1. Setup an NGINX Reverse Proxy on a Raspberry Pi (or any other Debian OS)

  2. Raspberry Pi Reverse Proxy with NGNIX and Letsencrypt SSL Encryption

  3. How To Serve NGINX Subdomains or Multiple Domains

  4. nginx Reverse Proxy on Raspberry Pi with Let's Encrypt