Introdução
Eu tenho um servidor de desenvolvimento (atualmente executando o Ubuntu 14.04 LTS), que venho usando há algum tempo para hospedar várias ferramentas de desenvolvimento em diferentes portas. Como as portas podem ser difíceis de lembrar, decidi usar a porta 80 para todos os meus serviços e fazer o encaminhamento de porta internamente, com base no nome do host.
Em vez de escrever domínio.com:5432, posso simplesmente acessá-lo por meio de sub.domínio.com
Por exemplo, o aplicativo X, que está usando a porta 7547 e está sendo executado em sub.domain.com, possui a seguinte configuração nginx:
upstream sub {
server 127.0.0.1:7547;
}
server {
listen 80;
server_name sub.domain.com www.sub.domain.com;
access_log /var/log/nginx/sub.log combined;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:7547;
proxy_set_header Authorization "";
}
}
A questão
Dada a estrutura de configuração atual, que escolhi, é possível usar letsencrypt e executar os diferentes serviços em https?
Sim, você pode ter solicitações de proxy nginx para servidores HTTP e, em seguida, responder aos clientes por HTTPS. Ao fazer isso, você deve ter certeza de que é improvável que a conexão nginx<->proxy seja detectada por quem quer que seja o invasor esperado. Abordagens suficientemente seguras podem incluir:
É improvável que o proxy para outro host na Internet pública seja seguro o suficiente.
Aqui estão as instruções para obter um certificado Let's Encrypt usando o mesmo servidor web que você está usando como proxy.
Solicitando seu certificado inicial da Let's Encrypt
Modifique sua
server
cláusula para permitir que o subdiretório.well-known
seja servido a partir de um diretório local, por exemplo:http://sub.domain.com/.well-known
é onde os servidores Let's Encrypt irão buscar as respostas para os desafios que lança.Você pode usar o cliente certbot para solicitar um certificado do Let's Encrypt usando o plug-in webroot (como root):
Sua chave, certificado e cadeia de certificados agora serão instalados em
/etc/letsencrypt/live/sub.domain.com/
Configurando o nginx para usar seu certificado
Primeiro crie uma nova cláusula de servidor como esta:
Recarregue o nginx:
Verifique se o HTTPS agora funciona visitando
https://sub.domain.com
ehttps://www.sub.domain.com
em seu navegador (e quaisquer outros navegadores que você deseja especificamente oferecer suporte) e verificando se eles não relatam erros de certificado.Recomendado: revise também raymii.org: Strong SSL Security on nginx e teste sua configuração em SSL Labs .
(Recomendado) Redirecionar solicitações HTTP para HTTPS
Depois de confirmar que seu site funciona com a
https://
versão do URL, em vez de receber conteúdo inseguro de alguns usuários porque acessaramhttp://sub.domain.com
, redirecione-os para a versão HTTPS do site.server
Substitua toda a cláusula da porta 80 por:Você também deve agora descomentar esta linha na configuração da porta 443, para que os navegadores se lembrem de nem tentar a versão HTTP do site:
Renove seu certificado automaticamente
Você pode usar este comando (como root) para renovar todos os certificados conhecidos pelo certbot e recarregar o nginx usando o novo certificado (que terá o mesmo caminho do seu certificado existente):
O certbot tentará apenas renovar os certificados com mais de 60 dias, portanto, é seguro (e recomendado!) Executar esse comando regularmente e automaticamente, se possível. Por exemplo, você poderia colocar o seguinte comando em
/etc/crontab
:Você pode testar as renovações com um teste, que entrará em contato com os servidores temporários da Let's Encrypt para fazer um teste real de contato com seu domínio, mas não armazenará os certificados resultantes:
Ou você pode forçar uma renovação antecipada com:
Observação: você pode testar quantas vezes quiser, mas as renovações reais estão sujeitas aos limites de taxa da Let's Encrypt .
Sim, você pode usar
nginx
como ponto final de https e cooperar com back-ends via http. Por exemplo minha configuração:Mas, como eu sei, com vamos criptografar, você deve apontar todos os subdomínios quando obter o certificado e, se isso for um problema, escolha url
https://host/service
em vez dehttps://service.host