As sessões em SSL / TLS existem desde SSL v2. Eles permitem que várias
conexões usem os mesmos dados de chave para calcular as chaves de criptografia para a
conexão, em vez de realizar uma negociação completa para determinar as
chaves de criptografia. Uma vez que eles estão reutilizando dados previamente trocados com segurança,
uma conexão segura pode ser estabelecida muito rapidamente. A alternativa é
realizar a negociação completa para cada conexão, o que é um processo caro.
Para ativar o cache de sessão SSL no nginx, adicione o seguinte ao seu nginx.conf
:
worker_processes 4;
http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
...
Isso cria um cache compartilhado (compartilhado por todos os processos de trabalho) de 10Mb.
1Mb detém aproximadamente 4.000 sessões. O tempo limite padrão do cache é de
cinco minutos, aqui ele foi aumentado para dez minutos.
Observe que, quando você tem vários processadores disponíveis, deve usá-los
aumentando o worker_processes
parâmetro para um valor não inferior
aos núcleos disponíveis. O handshake SSL é uma tarefa intensiva do processador, portanto, a
utilização dos processadores é benéfica.
Para reduzir ainda mais o número de apertos de mão, aumente keepalive_timeout
.
Isso permite várias solicitações por conexão.
server {
listen 443;
server_name www.nginx.com;
keepalive_timeout 70;
...
Depois de configurar isso, você pode testar se está funcionando executando o seguinte comando:
$ gnutls-cli -V -r HOSTNAME |grep 'Session ID'
- Session ID: 90:5B:99:E5:...
- Session ID: 90:5B:99:E5:...
- Session ID: 90:5B:99:E5:...
Se todos os três IDs de sessão forem iguais, o armazenamento em cache da sessão SSL estará operacional.
Uma nota final sobre o uso de uma cifra mais rápida
Finalmente, observe a seguinte linha acima:
ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
Este é o padrão do nginx com a adição de !kEDH
. Isso remove a cifra DHE-RSA-AES256-SHA lenta
de ser selecionada. Você pode ver a lista de cifras com suporte em seu servidor por meio de:
$ openssl ciphers
DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:
EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:
DHE-DSS-AES128-SHA:AES128-SHA:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:
EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:
EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:
EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5
Você pode verificar qual cifra seu site está usando via:
$ openssl s_client -host YOUR_HOSTNAME -port 443
Com os padrões do nginx, você verá o ciper DHE-RSA-AES256-SHA sendo usado:
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
e depois da cifra AES256-SHA mais rápida:
New, TLSv1/SSLv3, Cipher is AES256-SHA