Pré-requisitos
- Um servidor com IP público estático. É aqui que o Nginx está sendo executado.
- Servidores de back-end com o site pretendido em execução em HTTP
- Um nome de domínio registrado. Vou usar o ranvirslog.com como meu nome de domínio principal e os dois sites estão em FQDNs - ww1.ranvirslog.com e ww2ranvirslog.com
Configurar
Então, os endereços IP mudaram desde a última vez, já que estou fazendo esta configuração novamente. Aqui estão os novos IPs e nomes de host.
VM / Nome do host | IP Público | IP privado | Papel / Função |
ReverseProxy | 68.183.214.151 | 10.135.127.136 | Ponto de terminação TLS e servidor proxy reverso |
web1 | N / D | 10.135.126.102 | Hospedagem ww1.ranvirslog.com site na porta 80 HTTP |
web2 | N / D | 10.135.126.187 | Hospedagem ww2.ranvirslog.com site na porta 80 HTTP |
Os registros DNS são configurados de forma que ambos os sites (subdomínios diferentes) estejam apontando para o mesmo IP público estático. Este é o endereço IP do nosso proxy reverso Nginx:
Uma gravação | Valor |
ww1.ranvirslog.com | 68.183.214.151 |
ww2.ranvirslog.com | 68.183.214.151 |
Para fazer nosso DNS reverso funcionar em HTTP não criptografado, criamos dois arquivos em / etc / conf.d / nomeado ww1.conf e ww2.conf cada um com a seguinte configuração:
/ etc / conf.d / ww1.conf
servidorescute 80;
ouvir [::]: 80;
server_name ww1.ranvirslog.com;
localização /
proxy_pass http: // 10.135.126.102 /;
proxy_buffering off;
proxy_set_header X-Real-IP $ remote_addr;
/ etc / conf.d / ww2.conf
servidorescute 80;
ouvir [::]: 80;
server_name ww2.ranvirslog.com;
localização /
proxy_pass http: // 10.135.126.187 /;
proxy_buffering off;
proxy_set_header X-Real-IP $ remote_addr;
O sistema operacional que estamos usando é o Ubuntu 18.04 LTS e temos removido o arquivo / etc / nginx / sites-enabled / default para que o Nginx possa atuar puramente como um DNS reverso usando as configurações mostradas acima.
Objetivo
Com o DNS reverso (e os sites de back-end) já instalado e funcionando, nosso objetivo é instalar um único certificado TLS para ambos os FQDNs (que é ww1.ranvirslog.com e ww2.ranvirslog.com) em nosso proxy reverso Nginx.
O tráfego entre qualquer cliente e o proxy reverso será criptografado, mas o tráfego entre o proxy reverso e os servidores de backend não será criptografado. No entanto, esta ainda é uma opção infinitamente mais segura do que não ter HTTPS. Para casos em que o proxy reverso e os vários servidores da web estão no mesmo host, digamos que se você estiver usando contêineres Docker para hospedar todos no mesmo VPS, mesmo esse tráfego não criptografado está contido em um único host.
Instalando Certbot
Certbot é um programa cliente que será executado em nosso servidor proxy reverso e negociará um certificado TLS com LetsEncrypt. Isso provará ao LetsEncrypt que o servidor de fato tem controle dos FQDNs sobre os quais afirma ter controle. Não vamos nos preocupar sobre como o Certbot faz isso.
Tradicionalmente, você pode usar o Certbot como um software autônomo que apenas obterá os certificados (que são basicamente apenas chaves criptográficas longas) e os salvará no servidor. Mas, felizmente, para a maioria dos sistemas operacionais, existem plug-ins personalizados para Nginx, Apache e outros softwares. Vamos instalar o Certbot com o plugin Nginx. Isso configurará automaticamente o Nginx para usar as chaves recém-obtidas e se livrar de regras inseguras, como ouvir HTTP na porta 80.
Se você estiver usando sistemas baseados em Debian, como no meu caso estou usando o Ubuntu 18.04 LTS, então a instalação é uma brisa.
$ sudo apt update$ sudo apt install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa: certbot / certbot
$ sudo apt update
$ sudo apt install python-certbot-nginx
Outros sistemas operacionais, seu RedHat, Gentoo, Fedora podem seguir as instruções oficiais listadas aqui.
Depois de instalar o Certbot com plug-in Nginx para a sua combinação de sistema operacional, podemos ir direto ao que interessa.
Obtendo certificados TLS
Para obter o certificado TLS pela primeira vez, execute o seguinte comando:
$ sudo certbot --nginxIsso vai passar por uma série de perguntas interativas, conforme mostrado abaixo:
- Digite seu e-mail
Salvando log de depuração em / var / log / letsencrypt / letsencrypt.registro
Plug-ins selecionados: Autenticador nginx, Instalador nginx
Digite o endereço de e-mail (usado para renovação urgente e avisos de segurança) (digite 'c' para cancelar): [email protegido]
- Concordar com os TOS
Leia os Termos de Serviço em https: // letsencrypt.org / documents / LE-SA-v1.2-novembro-15-2017.pdf. Você deve concordar para se registrar no servidor ACME em https: // acme-v02.api.deixa criptografar.org / diretório
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A) gree / (C) ancel: A
- Boletim Opcional
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Você estaria disposto a compartilhar seu endereço de e-mail com a Electronic Frontier Foundation, um parceiro fundador do projeto Let's Encrypt e a organização sem fins lucrativos que desenvolve o Certbot? Gostaríamos de enviar a você um e-mail sobre nosso trabalho criptografando a web, notícias da EFF, campanhas e formas de apoiar a liberdade digital.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(S) es / (N) o: S
- Em seguida, ele detectará os nomes de domínio em seu servidor e, se você quiser selecionar todos os domínios, basta pressionar
Para quais nomes você gostaria de ativar o HTTPS?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: ww1.ranvirslog.com
2: ww2.ranvirslog.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Selecione os números apropriados separados por vírgulas e / ou espaços, ou deixe a entrada em branco para selecionar todas as opções mostradas (digite 'c' para cancelar):
- Redirecionar tudo para TLS. Eu escolhi a opção 2 para redirecionar tudo para SSL, mas seu caso de uso pode ser diferente. Para novas instalações de back-end, é seguro escolher a opção 2.
Escolha se deseja ou não redirecionar o tráfego HTTP para HTTPS, removendo o acesso HTTP.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Sem redirecionamento - não faça mais alterações na configuração do servidor da web.
2: Redirecionar - Faça todas as solicitações redirecionarem para o acesso HTTPS seguro. Escolha esta opção para novos sites ou se tiver certeza de que seu site funciona em HTTPS. Você pode desfazer esta alteração editando a configuração do seu servidor web.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Selecione o número apropriado [1-2] e [enter] (pressione 'c' para cancelar): 2
Se tudo correr bem, ele mostrará esta mensagem, apenas para seus nomes de domínio.
Parabéns! Você ativou https: // ww1 com sucesso.ranvirslog.com e https: // ww2.ranvirslog.com Você pode visitar os FQDNs e perceber que os sites agora têm a placa do cadeado sugerindo que tudo está criptografado.
Olhe para os arquivos de configuração
Se você visualizar os arquivos de configuração que criamos anteriormente, ou seja, / etc / conf.d / ww1.conf e / etc / conf.d / ww2.conf, você notará que todas as regras “Listen 80” desapareceram e algumas novas linhas foram adicionadas informam ao servidor que a comunicação precisa ser criptografada e a localização dos certificados e chaves para realizar a referida criptografia.
Eu recomendo fortemente olhar através dos arquivos de configuração, uma vez que também pode ensiná-lo a instalar certificados e escrever arquivos de configuração corretamente.
Renovação de Certificação
Os certificados LetsEncrypt típicos são válidos por 90 dias e, antes que eles expirem, você precisa renová-los. Você pode usar o Certbot para primeiro testar a renovação, executando o comando:
$ sudo certbot renew --dry-runSe a operação for bem-sucedida, você verá a seguinte mensagem:
Parabéns, todas as renovações foram bem-sucedidas. Os seguintes certificados foram renovados:
/ etc / letsencrypt / live / ww1.ranvirslog.com / fullchain.pem (sucesso)** DRY RUN: simulando a 'renovação do certbot' perto da expiração do certificado
** (Os certificados de teste acima não foram salvos.)
Agora você pode adicionar um Cron job que tentará a renovação a cada semana ou mais. Certbot não renovará os certificados, a menos que seja realmente devido a isso, então você não precisa se preocupar. O comando para a renovação real é:
$ certbot renovarAdicione-o ao cron job do root usando:
$ sudo crontab -eNo prompt a seguir, selecione seu editor favorito (escolha Nano se não tiver certeza) e adicione as seguintes linhas no final do arquivo agora aberto:
…# Por exemplo, você pode executar um backup de todas as suas contas de usuário
# às 5 a.m todas as semanas com:
# 0 5 * * 1 tar -zcf / var / backups / home.tgz / home /
#
# Para obter mais informações, consulte as páginas de manual do crontab (5) e cron (8)
#
# m h dom mon dow comando
* 2 * * 2 renovação do certificado
Isso executará o comando certbot renew às 2 da manhã em qualquer minuto aleatório, no segundo dia de cada semana.
Conclusão
Se você é novo em certificados TLS, experimentar coisas como HSTS pode ser arriscado. Uma vez que essas mudanças são irreversíveis. No entanto, se você quiser mergulhar na toca do coelho da segurança, posso recomendar o blog de Troy Hunt, que é uma das principais inspirações por trás deste artigo.