Neste post vou explicar como criar um certificado SSL auto-assinado e configurar o NGINX para aceitar conexões HTTPS. Utilizei um Raspberry Pi versão 2 com Raspbian para montar este exemplo.
Considerando que o NGINX já esteja instalado, vamos criar um virtual host que vai receber as conexões HTTPS:
sudo touch /etc/nginx/sites-avaliable/static.conf
Exemplo de uma configuração básica de um virtual host no NGINX
sudo vim /etc/nginx/sites-avaliable/static.conf
server { listen 80; server_name static.example.com; root /var/www/static.example.com; index index.html; location / { try_files $uri $uri/ =404; } }
Ative o virtual host
ln -s /etc/nginx/sites-avaliable/static.conf /etc/nginx/sites-enable/static.conf
Reinicie o serviço
systemctl restart nginx
Pronto, agora vamos para configuração do SSL
Vamos criar um diretório para armazenar a chave e o certificado
sudo mkdir -p /etc/nginx/ssl
Para criar o certificado vou utilizar o openssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/static.key -out /etc/nginx/ssl/static.crt
Vamos editar o novamente o arquivo de configuração que criamos no inicio do post e adicionar as linhas abaixo
server { listen 80; server_name static.example.com; # SSL listen 443 ssl; ssl_certificate /etc/nginx/ssl/static.crt; ssl_certificate_key /etc/nginx/ssl/static.key; ssl_protocols TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; root /var/www/static.example.com; index index.html; location / { try_files $uri $uri/ =404; } }
Pronto, observe que apenas os protocolos TLS 1.1 e TLS 1.2 estão ativos, a versão 1.0 TLS e o protoloco SSL 3.0 contém vulnerabilidades que foram amplamente divulgadas, fica como referência o report CVE-2014-3566. Outro item importânte é em relação a lista de ciphers, nesta configuração a encryptação usando MD5 esta desabilitada, por ser considerada fraca.
Para ativar a configuração reinicie o serviço
systemctl restart nginx
Quando o você acessar o endereço https (https://<server_name>/) você vai receber um alerta informando que o certificado não é assinado por uma certificadora (NET::ERR_CERT_AUTHORITY_INVALID), como é ambiente de teste do qual temos controle, ignore o aviso e aceite o risco.