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.
