Como configurar SSL com OpenSSL e Docker - Programadores Brasil
Tutoriais para Engenharia de SoftwareTutoriais para Segurança Digital

[TUTORIAL] Como configurar o SSL em seu ambiente de Desenvolvimento com Docker, OpenSSL e Nginx

4 Mins read
Veja como Configurar SSL no seu ambiente de Desenvolvimento Local com Docker, OpenSSL e Nginx.

Nos dias de hoje, garantir a segurança e criptografia dos seus dados é um dos bem mais valiosos. Neste sentido, dentro do Desenvolvimento Web, a implementação de certificados SSL torna-se imprescindível. Veja neste texto do Pedro Lopes, parceiro do Programadores Brasil, como Configurar SSL no seu ambiente de Desenvolvimento Local com Docker, OpenSSL e Nginx.

O que é um certificado SSL?

O certificado SSL (Secure Sockets Layer) permite a comunicação criptografada entre um navegador e um servidor web. Ele é utilizado para reduzir o risco de roubo ou adulteração das informações que estão sendo transmitidas entre o cliente e o servidor. Na essência, o certificado de segurança SSL permite uma “conversa” privada entre duas partes interessadas.


Ao final do texto, caso você tenha alguma observação, dúvida, crítica ou sugestão sobre o conteúdo, acesse o Linkedin do Pedro Lopes CLICANDO AQUI e deixe seu recado. Boa leitura!


Por que configurar SSL

Por que configurar SSL e rodar seus projetos com HTTPS no ambiente de desenvolvimento ?

Na maior parte das vezes, seu site ou sistema em produção estará rodando com SSL/TLS habilitado, ou seja, em HTTPS.

Entretanto sua aplicação pode trabalhar apenas com a suposição de que está rodando com uma conexão SSL. Por exemplo, o cabeçalho Set-Cookie possui o atributo Secure que significa que o cookie só será enviado caso esteja em uma conexão TLS/SSL.

Isso quer dizer que localmente, no ambiente de desenvolvimento, você precisaria condicionar seu código para habilitar o envio do cookie em uma conexão que não seja TLS/SSL, em outras palavras ‘if environment = local => remova Secure’.

Mantenha desenvolvimento, homologação e produção o mais similar possível

Historicamente sempre houveram disparidades entre os ambientes de desenvolvimento e produção. Desenvolvedores, em geral, não se preocupavam com a infra, isso era um trabalho que a equipe de deploy deveria lidar.

De acordo com o princípio da paridade Dev/prod (Dev/prod parity principle), da Twelve-Factor App, se nossa aplicação está rodando em HTTPS (com SSL/TLS), nós devemos rodar em HTTPS (com SSL/TLS) localmente, em desenvolvimento e em homologação. Ter uma condicional onde lê-se “se estou em ambiente local, rode de uma forma, mas caso esteja em produção, rode de outra” é uma brecha no princípio da paridade Dev/Prod.

Em outras palavras, assumindo que estamos hospedados em um ambiente que lida com certificados SSL para nós (AWS ELS, Google Cloud Load Balance, etc), localmente devemos ter código e infraestrutura para fazer o mesmo.

Enfim, chega de papo e vamos trabalhar…

Criar um certificado SSL com OpenSSL

Verifique se o pacote OpenSSL já está instalado no sistema. No terminal, execute o comando:

$ which openssl
# /usr/bin/openssl

Navegue para o diretório no qual você irá armazenar o certificado:

$ cd ~/ssl

Com o comando abaixo você irá gerar o certificado:

$ openssl req -x509 -nodes -newkey rsa:2048 -keyout cert.key -out cert.crt -days 365

As informações do questionário será associado ao certificado, mas não precisa ser preenchido com informações verídicas:

Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Sao Paulo
Locality Name (eg, city) [ ]:Sao Paulo
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Empresa
Organizational Unit Name (eg, section) [ ]: Tecnologia
Common Name (e.g. server FQDN or YOUR name) [ ] :Pedro Lopes
Email Address [ ]:[email protected]

Pronto. Os dois arquivos gerados, cert.key e cert.crt, bastam para configurar SSL e ambiente seguro no Linux com Docker. Simples assim.

Configurar SSL: Portas do Nginx

Abra o arquivo do docker-compose (docker-compose.yml) e encontre a configuração do Nginx. Adicione a porta segura SSL.

Obs 1: Algo que você deve saber, HTTP roda a partir da porta:80 enquanto HTTPS roda na porta:443.

Obs 2: Se estiver utilizando um servidor EC2 para rodar o Docker, garanta que você habilitou a porta HTTPS. Caso contrário, adicione a porta HTTPS no grupo de segurança.

Regras de entrada — AWS Security Group
# The Web Server
web:
[...]
ports:
- 8081:80
- 443:443

Monte o certificado na imagem do Nginx

Você precisa copiar os arquivos do certificado para dentro do container Nginx. Aqui vai depender de como você está configurando seu container. Eu utilizo um .dockerfile exclusivo para isso, assim fica mais fácil de gerenciar esse tipo de demanda.

FROM nginx:1.10
[…]
ADD path/ssl/cert.crt /etc/nginx/certs/cert.crt
ADD path/ssl/cert.key /etc/nginx/certs/cert.key

Ou, caso esteja configurando diretamente no docker-compose

# The Web Server
web:
[…]
ports:
- 8081:80
- 443:443
volumes:
- /path/ssl/certs:/etc/nginx/certs

Altere o arquivo de configuração do Nginx

Normalmente a configuração básica se parece com isto:

server {
    listen 80;
    server_name www.seusite.com;
    location / {
        proxy_pass http://frontend:500
        error_log /var/log/front_end_errors.log;
    }

Mas para você configurar SSL na sua aplicação, você deve passar alguns parâmetros e valores adicionais.

Você deve, por exemplo, habilitar a porta 443 e adicionar a referência ao certificado como abaixo:

server {
listen 80;
listen 443 ssl;
ssl_certificate /etc/nginx/certs/cert.crt;
ssl_certificate_key /etc/nginx/certs/cert.key;
[…]

Após alterar as configurações do Nginx, monte a imagem da sua aplicação rodando docker-compose up — build.

Agora você pode acessar a sua aplicação via https://www.aplicacao.com a partir de um navegador.

Se ocorreu tudo certo, você deve se deparar com este aviso:

Chrome: ERR_CERT_AUTHORITY_INVALID

A tela informando que o certificado não é válido pode aparecer diferente dependendo do navegador. Basta você selecionar para o navegador ignorar e seguir para o site (no Chrome, clique em Avançado -> Ir para).

Conclusão

Se chegou neste ponto, você agora possui uma maneira simples, sustentável e grátis de habilitar HTTPS para suas aplicações sem a necessidade de softwares extras na sua máquina, afinal estamos utilizando o Docker para isso.

Criar um Self-signed SSL certificate é uma maneira rápida para adicionar uma camada de criptografia SSL no seu servidor de desenvolvimento ou homologação. Contudo não é recomendado para o ambiente de produção, pois não possui uma assinatura validada por uma Certificate Authority confiável.

Dúvidas, críticas ou sugestões…

Deixe abaixo nos comentários que o Pedro Lopes irá te auxiliar nelas. Ainda, não esqueça de acessar o Linkedin do Pedro Lopes CLICANDO AQUI.


1 comentário

Deixe o seu comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *