Buscando por “ssl test” no Google, os dois primeiros resultados encontrados correspondem a duas ferramentas muito úteis. Uma, o SSL Checker da SSL Shopper, fornece informações básicas sobre o certificado. Um certificado da StartSSL que tenha sido gerado com as dicas do último post resulta em uma saída parecida com esta:

As informações estão dispostas de forma bem didática, mas ainda vale a pena comentar sobre cada item:

  • ssl.myhro.net resolves to 52.2.85.74: primeiro teste, exibindo o IP resolvido. Esta informação é importante para termos certeza que o teste está sendo realizado no servidor correto, o que poderia não acontecer no caso de uma entrada DNS alterada recentemente que ainda estivesse em cache;
  • Server Type: nginx/1.4.6 (Ubuntu): informações sobre o servidor, que no caso é o nginx 1.4.6, versão presente no Ubuntu 14.04;
  • The certificate should be trusted by all major web browsers (all the correct intermediate certificates are installed): destaca a importância do encadeamento correto dos certificados, com a presença dos certificados intermediários, também citada no post sobre a StartSSL;
  • The certificate was issued by StartCom: entidade certificadora responsável por emitir e assinar o certificado;
  • The certificate will expire in 365 days: tempo restante (em dias) pelo qual o certificado ainda é válido. É possível adicionar um lembrete de expiração, mas normalmente a empresa responsável pela emissão já irá realizar isto quando o prazo estiver vencendo;
  • The hostname (ssl.myhro.net) is correctly listed in the certificate: informa que o hostname está presente no certificado, o que significa que um browser não irá acusar a divergência de hostnames entre o certificado e a página de fato acessada.

Por fim, há uma representação gráfica da relação entre os certificados, com mais algumas informações quanto ao período de validade, algoritmo de assinatura, etc. O mais importante a se destacar neste momento é que, embora seja uma boa notícia o fato do certificado não ter apresentado problema nesta validação básica, isto não significa que o site por trás dele está realmente seguro. É preciso, portanto, realizar uma análise mais detalhada, como a oferecida pelo SSL Server Test da Qualys SSL Labs.

O resultado obtido com a configuração padrão do nginx no Ubuntu 14.04 é o seguinte:

Dois problemas comprometeram a nota do teste: a qualidade da troca de chaves utilizando o protocolo Diffie-Hellman e a vunerabilidade à falha de segurança do SSL 3.0 conhecida como POODLE. Felizmente, estas duas fraquezas são simples de serem resolvidas e o próprio teste aponta para documentações relevantes sobre os problemas.

Diffie-Hellman

O guia de implantação do Diffie-Hellman para TLS traz uma descrição detalhada e até um pouco paranóica (especificando todas as cifras suportadas, o que não é necessário) sobre como reforçar a segurança da troca de chaves. Resumidamente, é preciso realizar dois passos. O primeiro é gerar um grupo de parâmetros DH com tamanho de 2048 bits:

openssl dhparam -out dhparams.pem 2048

E em seguida adicionar estas duas linhas ao arquivo de configuração do nginx (seja globalmente ou por virtual host):

ssl_dhparam /etc/nginx/ssl/dhparams.pem;
ssl_prefer_server_ciphers on;

… Após ter movido o arquivo gerado para o diretório /etc/nginx/ssl/.

O resultado ainda continua com classificação C, por causa do POODLE, mas não há mais menção ao problema com o protocolo Diffie-Hellman. A nota no quesito “Protocol Support” subiu de 70 para 90:

POODLE

Resolver a questão do POODLE é mais fácil ainda, já que basta desabilitar o suporte ao SSL 3.0 no nginx. Por mais estranho que pareça, a configuração padrão do Ubuntu 14.04 adiciona a opção SSLv3 ao parâmetro ssl_protocols. Isto provavelmente se deve ao fato desta versão ter sido lançada em torno de 6 meses antes da descoberta da vulnerabilidade. Para reverter esta configuração, a seguinte linha deve estar presente na configuração do nginx:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Esta linha força o nginx a suportar apenas protocolo TLS (Transport Layer Security) (e não SSL (Secure Sockets Layer)), em suas versões de 1.0 a 1.2. Agora, a classificação do teste passa a ser A e a nota do “Protocol Support” atinge 95:

Mesmo assim, ainda há uma pequena melhoria a ser realizada.

HSTS

O HSTS (HTTP Strict Transport Security) é um header adicionado à resposta de uma requisição HTTP que informa ao cliente que todas as conexões a este servidor, dali em diante, devem ser realizadas via HTTPS. O processo para habilitá-lo no nginx consiste em adicionar a seguinte linha ao seu arquivo de configuração:

add_header Strict-Transport-Security "max-age=31536000";

E com isto a classificação sobe para A+, ainda que as notas individuais de cada quesito não mudem:

Arquivo de configuração do nginx

O arquivo de configuração do virtual host do nginx resultante das modificações realizadas durante os testes é este:

# HTTPS redirect
#
server {
    listen 80;
    server_name ssl.myhro.net;
    return 301 https://ssl.myhro.net$request_uri;
}

# HTTPS server
#
server {
    listen 443 ssl;
    server_name ssl.myhro.net;
    add_header Strict-Transport-Security "max-age=31536000";

    root /usr/share/nginx/html;
    index index.html index.htm;

    ssl on;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;
    ssl_dhparam /etc/nginx/ssl/dhparams.pem;

    ssl_session_timeout 5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location / {
        try_files $uri $uri/ =404;
    }
}

Vale ressaltar que foi adicionado o redirecionamento HTTP -> HTTPS, um comportamento que não é realizado por padrão, mas que é interessantíssimo caso seu interesse realmente seja servir conteúdo de forma segura. Desta forma, todos os visitantes acessarão o site via HTTPS automaticamente.