Como resolver o problema de criptografia obsoleta no Chrome

Eu estava com uma preguiça enorme de renovar o certificado SSL do meu blog. Quando finalmente tomei uma atitude e resolvi o problema, um amigo me mandou a imagem abaixo:

Como vocês podem ver, a mensagem diz que o site está utilizando uma criptografia obsoleta e que além disso, "inclui outros recursos não seguros". Confesso que nunca tinha prestado atenção nisso, e provavelmente esta mensagem já estava lá antes de eu renovar meu certificado.

A Solução

O segundo problema foi bem simples: depois de inspecionar o site para ver se ele está carregando algum javascript ou outro asset de um CDN ou coisa do tipo, descobri que, uma imagem que eu estava usando, vinha diretamente da wikipedia. Foi só salvar essa imagem no servidor e utilizá-la para a página deixar de "incluir outros recursos não seguros".

Já a mensagem da criptografia obsoleta levou um pouco mais de tempo, afinal, o certificado era "novinho" e eu havia optado por uma chave com 4096 bits. Além disso, me recordava de ter configurado o servidor web para não utilizar versões obsoletas do SSL (v1 e v2) e do TLS (v1.1).

É importante ressaltar aqui que tal mensagem não tem relação alguma com o preço do certificado: não importa se ele é barato ou caro. A própria mensagem deu a dica fundamental: o problema era o HMAC-SHA1. Por mais que eu ignorasse o que era o HMAC, sabia que o SHA-1 já encontrava-se obsoleto há muito tempo.

Então a solução foi forçar o servidor a não utilizar esse algoritmo.

NGINX

Se você utiliza o Nginx, altere a opção ssl_ciphers nas configurações do seu site:

# /etc/nginx/sites-enable/default.conf 
server {
 listen 443 ssl;
 root /var/www/exemplo.com/;
 server_name exemplo.com;
   ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA';

        ssl_protocols SSLv3 TLSv1.2;
        ssl_prefer_server_ciphers on;
...
...
...
}

Reinicie o servidor com:

# service nginx reload
Apache HTTP Server

Eu não testei, mas pelo que pesquisei, é preciso fazer algo semelhante na opção SSLCipherSuite do campo VirtualHost do arquivo /etc/apache2/sites-enable.

<VirtualHost *:443>
    ...
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate
    SSLCertificateChainFile /path/to/intermediate_certificate
    SSLCertificateKeyFile   /path/to/private/key
    SSLCACertificateFile    /path/to/all_ca_certs

    # Configuração intermediária, ajuste conforme suas necessidades
    SSLProtocol             all -SSLv2 -SSLv3
    SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA
    SSLHonorCipherOrder     on
    SSLCompression          off

    # OCSP Stapling, only in httpd 2.3.3 and later
    SSLUseStapling          on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
    # On Apache 2.4+, SSLStaplingCache must be set *outside* of the VirtualHost
    SSLStaplingCache        shmcb:/var/run/ocsp(128000)
 
    # Enable this if your want HSTS (recommended)
    # Header add Strict-Transport-Security "max-age=15768000"
 
    ...
</VirtualHost>

Reinicie o servidor para que as mudanças tenham efeito:

service apache2 restart

Não sei porque raios os fornecedores acima não trazem essas configurações como padrão. Contudo, depois de efetuar as mudanças acima, o navegador mostra um cadeado completamente verde e sem ressalvas! \o/