Skip to content
This repository has been archived by the owner on Apr 14, 2023. It is now read-only.

Latest commit

 

History

History
276 lines (188 loc) · 6.73 KB

manual-nginx-ssl.md

File metadata and controls

276 lines (188 loc) · 6.73 KB

Aqui vamos descrever como foi o processo para implemetar ssl no servidor nginx da aplicação:

Configurar ssl em servidor nginx.

1 Instalar LEMP

(como não lembro o tutorial que usei, coloquei um link de referencia) https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-7

Não sei o motivo, mas o tutorial diz que é preciso ter LEMP (Linux + nginx + MySQL + PHP) instalados.
Linux já es tá ok.
O nginx também.
O mySQL pe que me deixa confuso, por que?
O PHP acredito que seja para rodar algum script do certbot.

2 instalação do certbot

2.1 - Para instalar o certbot usamos os seguintes links de referencia:

https://certbot.eff.org
https://certbot.eff.org/lets-encrypt/centosrhel7-nginx

2.2 - Ao consultar o manual de instalação para o CentOS 7 vimos que seria preciso instalar o snapd (gerenciador de pacotes).

https://linuxscriptshub.com/install-letsencrypt-ssl-nginx-centos-6/ (letsencrypt falhou então usei o linka abaixo) https://snapcraft.io/docs/installing-snapd
https://snapcraft.io/docs/installing-snap-on-centos

Para instalar "extra packages":

$ sudo yum install epel-release

Para instalar o snapd:

$ sudo yum install snapd

Para habilitar o serviço:

$ sudo systemctl enable --now snapd.socket

Para habilitar o classic snap suport(?):

$ sudo ln -s /var/lib/snapd/snap /snap

2.3 - Com o snapd instalado, intalar e configurar o certbot

Para instalar o certbot

$ sudo snap install --classic certbot

Para colocar o comando no bash

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

3 Gerar certificados

https://certbot.eff.org/lets-encrypt/centosrhel7-nginx
https://linuxscriptshub.com/install-letsencrypt-ssl-nginx-centos-6/ (usei mais este)
https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-on-centos-7

Problema: Tivemos problemas para gerar certificado pois nossa url de teste continha "_" que é uma caractere invlálido. fizemos a correção.

Observação: Optamos por apenas gerar os certificados (certonly) e fazer as configurações do servidor manualmente.

Para gerar um certificado a partir no nginx:

O comando abaixo vai localizar os dominios que já estão disponiveis no nginx e perguntara de qual você deseja criar o certificado. Optamos por repetir o processo para cada dominio.

No nosso teste, usamos o dominio (teste-editais.sead.ufes.br)

$ sudo certbot certonly --nginx

Se tudo correu normalmente suas chaves são geradas em (/etc/letsencrypt/live).

4 Gerar server key do servidor nginx

Para criar a pasta onde a chave será armazenada:

\# mkdir /etc/nginx/ssl

Para entrar na pasta:

\# cd /etc/nginx/ssl

Para gerar a server.key dentro da pasta:

O comando abaixo vai solicitar um password para criar uma chave única. Forneça-o.

\# openssl genrsa -des3 -out server.key 2048

Para gerar a server.csr dentro da pasta:

\# openssl req -new -key server.key -out server.csr

5 Configurar virtualhosts do servidor nginx

Nosso nginx foi configurado com as pastas sites-available e sites-enabled. Na primeira pasta criarmos 3 arquivos. Na segunda, links para os arquivos que serão disponibilizados.

5.1 - O primeiro arquivo (000-default.conf):

Este arquivo deve pegar qualquer link que não seja de outros server configurados e devolver uma resposta "vazia" para o requisitante:

server {
    listen 80 default_server;
    server_name _;
    return 444; # "Connection closed without response"
}

5.2 - O segundo arquivo (teste-editais.sead.ufes.br.conf):

Aqui temos a configuração de um dominio pelo qual o servidor responde:

São dois servidores vituais, um redirecionando o trafego da porta 80 (http) para o endereço que possui ssl e outro com as configurações de ssl deste dominio.

server {
    listen 80;
    server_name teste-editais.sead.ufes.br;
    return https://teste-editais.sead.ufes.br$request_uri;
}

server {
    #ssl settings
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/teste-editais.sead.ufes.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/teste-editais.sead.ufes.br/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/teste-editais.sead.ufes.br/chain.pem;

    server_name teste-editais.sead.ufes.br;

    location / {
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 	    proxy_set_header X-Forwarded-Proto $scheme;
 	    proxy_set_header X-Real-IP $remote_addr;
 	    proxy_set_header Host $http_host;
 	    proxy_pass http://127.0.0.1:5000;
 	    proxy_redirect off;
    }

    location /api {
	    proxy_pass http://127.0.0.1:3000;
	    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;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

5.3 - Outros arquivo em (/etc/nginx/sites-available):

Outros dominios que tem certificados criados em (/etc/letsencrypt/live):
As configurações ssl de outros dominios serão configurados da mesma forma que o segundo arquivo.

6 - Ajustes finais.

6.1 - ajustes nas aplicações node.js que servimos:

Alguns ajustes no sistema foram efetuadas para o funcionamento correto do das configurações ssl no servidor:

6.1.1 - No sps-server

Parar o serviço pm2:

\# pm2 stop sps-server-teste

Ajustar o arquivo de configuração (~/sps-teste/server/config/site.js):
A nova url deve apontar para o servidor https.

\# vim ~/sps-teste/server/config/site.js

Reiniciar o serviço pm2:

\# pm2 start sps-server-teste

6.1.2 - No sps-client

Parar o serviço pm2:

\# pm2 stop sps-client-teste

Ajustar o arquivo de configuração (~/sps-teste/client/src/config/backend.js)
A nova url deve apontar para o servidor https.

\# vim ~/sps-teste/client/src/config/backend.js

Fazer o rebuild do bundle:

\# cd ~/sps-teste/client
\# npm run build

Reiniciar o serviço pm2:

\# pm2 start sps-client-teste

6.2 - Ajuste no servidor nginx:

Checar syntax dos arquivos de configuração:

\# nginx -t

Reiniciar servidor nginx para aplicar as novas configurações:

\# systemctl restart nginx

7 - Renovação automática de certificados.

Podemos solicitar ao certbot renovação automatica dos certificados, isso vai colocar um script no "cron" do sistema operacional.

\# sudo certbot renew --dry-run

O cmando para a renovação do certbot estará instalado em uma das localizaçãoes a seguir:

/etc/crontab/
/etc/cron.*/*
systemctl list-timers (Nosso caso)