À medida que a consciência de todos sobre a segurança online aumenta e as principais empresas de Internet promovem a popularização do HTTPS, o HTTPS SSL tornou-se basicamente o padrão para a construção de sites. Graças aos certificados SSL gratuitos fornecidos por Let’s Encrypt, Digicert, TrustAsia, Symantec, etc., o custo de usar HTTPS agora é insignificante, seja um site pessoal ou corporativo.
Por segurança, precisamos usar HTTPS, mas ativar o SSL aumentará a sobrecarga de memória, CPU e largura de banda da rede. Comparado com http, usando o handshake de três vias TCP para estabelecer uma conexão, o cliente e o servidor precisam trocar 3 pacotes. Além dos três pacotes de TCP, o https também precisa de 9 pacotes necessários para o handshake SSL, totalizando 12. pacotes. Portanto, se o HTTPS for muito otimizado, ele estará propenso a diminuir o desempenho.
Claro, algumas pessoas podem pensar que o aumento da sobrecarga do servidor HTTPS e SSL basicamente não é sentido. Isso ocorre porque o tráfego do site é relativamente pequeno e a configuração de desempenho do servidor é suficiente para suportar o tráfego atual. Mas para grandes sites, como Baidu, Google e aplicativos populares, ainda é muito útil otimizar o desempenho do HTTPS e reduzir o consumo de recursos.
Este artigo compartilhará alguma experiência na otimização do uso de HTTPS e SSL. Existem mais tutoriais de experiência sobre certificados SSL e HTTPS:
- Coleta e resumo gratuitos de certificados SSL - adicione acesso criptografado seguro HTTPS ao site gratuitamente
- Dez dicas de aceleração de CDN grátis do CloudFlare que você talvez não conheça-SSLDDOSCache
- Habilite o HSTS e junte-se à lista de pré-carregamento do HSTS para tornar o acesso HTTPS ao site mais seguro - com métodos para excluir o HSTS
PS: Atualizado em 6 de setembro de 2018, se você quiser usar um serviço pago de resolução de DNS, aqui estão dois serviços DNS mais baratos e mais adequados para indivíduos: Dois produtos DNS adequados para uso pessoal: ClouDNS e DNS Resolução facilitada de nomes de domínio.
PS: Atualizado em 15 de janeiro de 2019, Se você deseja que o acesso SSL obtenha velocidade mais rápida e melhor desempenho, você pode tentar a compactação TLSV1.3 e Brotli: Aceleração de otimização de site - ative a compactação TLSV1.3 e Brotli -Oneinstack, LNMP, painel Pagoda.
1. Como escolher um certificado SSL grátis?
Recomenda-se escolher Let’s Encrypt. Embora o certificado SSL gratuito Let’s Encrypt tenha duração de apenas 90 dias, ele pode ser renovado indefinidamente e suporta renovação manual e automática. Let’s Encrypt SSL é reconhecido por todos os principais navegadores e é a primeira escolha para certificados SSL gratuitos. Tutorial: Vamos criptografar o aplicativo de um clique do certificado SSL de nome de domínio gratuito Wildcard e tutorial de uso de SSL.
Let’s Encrypt é adequado para hosts com IPs independentes, como VPS. Caso contrário, você só poderá usar alguns aplicativos de certificado SSL online desenvolvidos usando a API Let’s Encrypt. Claro, se você tiver uma certa solidez financeira, é mais viável escolher um certificado SSL pago. Para mais certificados SSL, consulte: Coleção e resumo de certificados SSL gratuitos.
2. Habilite HSTS no servidor
Os sites que usam o protocolo HSTS garantirão que o navegador sempre se conecte à versão HTTPS do site, sem exigir que os usuários insiram manualmente um endereço criptografado contendo https://
na barra de endereço URL. Eu uso o servidor Nginx, só preciso editar o arquivo de configuração do Nginx (como: /usr/local/nginx/conf/nginx.conf) e adicionar as seguintes linhas ao bloco do servidor da configuração HTTPS:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
Para obter detalhes sobre como habilitar HSTS para Apache, Lighttpd, etc., consulte: Habilitar HSTS no servidor.
3. Adicione o nome de domínio ao plano da lista de pré-carregamento HSTS
Embora o protocolo HSTS esteja habilitado acima para garantir que os usuários sempre acessem conexões HTTPS, geralmente os usuários que visitam o site pela primeira vez inserirão habitualmente nomes de domínio não https, o que leva ao problema de sequestro de http ao visitar o site pela primeira vez. tempo. O plano da lista de pré-carregamento HSTS é para resolver este problema. É uma lista integrada em navegadores como o chromeFirefoxEdge.
Como ingressar na lista de pré-carregamento HSTS: Habilite o HSTS e ingresse na lista de pré-carregamento HSTS para tornar o acesso HTTPS ao site mais seguro - Em anexo está o método de exclusão do HSTS. No momento, wzfou.com foi adicionado com sucesso à lista de pré-carregamento do HSTS. Se você estiver usando o Chrome ou Firefox, na primeira vez que visitar este site, você usará HTTPS para se conectar por padrão.
Ativar grampeamento OCSP no Nginx. (ssl_trusted_certificate pode ser omitido se a diretiva ssl_certificate especificar a cadeia completa de certificados)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certs/chained.pem;
Ativar grampeamento OCSP no Apache:
Em <VirtualHost></VirtualHost>
adicione:
SSLUseStapling on
Fora de <VirtualHost></VirtualHost>
adicione:
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
5. Use certificados duplos ECC e RSA
Por padrão, todos usaremos certificados RSA porque os certificados RSA têm a mais ampla compatibilidade. No entanto, o certificado ECC tem as características de tamanho pequeno, velocidade de computação rápida e alta segurança (a chave ECC
de 256 bits pode fornecer a mesma segurança que a chave RSA
de 3072 bits) Ele pode fornecer desempenho HTTPS até certo ponto.
Let’s Encrypt já suporta a geração de certificados ECC. Use acme.sh para emitir certificados SSL. Especifique --keylength ec-256
para alterar o tipo de certificado para ECC:
acme.sh --issue -w /data/wwwroot/wzfou.com -d wzfou.com -d www.wzfou.com --keylength ec-256
Deve-se observar que o ECC não é compatível com Windows XP. Neste momento, pensaremos em usar certificados duplos. Ou seja, quando o certificado ECC não for compatível, o Nginx exibirá automaticamente o certificado RSA para o usuário. Se a versão do nginx for superior a 1.11
, você pode escrever diretamente os caminhos dos certificados duplos ECC e RSA no arquivo de configuração wzfou.com demonstra o seguinte:
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
Reinicie o Nginx Quando usuários como XP que não suportam certificados ECC acessam o site, o certificado RSA é exibido.
Outros usuários preferem usar certificados ECC.
Se você achar que o ECC não é exibido preferencialmente, verifique se ssl_prefer_server_ciphers
está habilitado e se ssl_ciphers
está configurado corretamente.
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
Além disso, você pode escolher qualquer um dos três seguintes (apenas para teste):
ssl_ciphers 'EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-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:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
6. Habilite DNS CAA
A função do DNS CAA é permitir apenas que a CA listada no registro emita certificados para o nome de domínio (ou nome de subdomínio) para evitar que alguém falsifique certificados SSL. Ao mesmo tempo, o registro CAA pode controlar a emissão de um único domínio. nomeia certificados SSL e também pode controlar o certificado Wildcard. Para métodos detalhados, consulte: Configurações de DNS do JD Cloud CAA.
Problema:A ativação do DNS CAA resulta em um erro: Verifique o erro: registro CAA para emissão *.wzfou.comprevents. A solução é adicionar o registro issuewild
: 0 issuewild "letsencrypt.org"
. Além disso, são fornecidos dois sites para verificar se a configuração do CAA está correta:
- HTTPS://CAA test.co.UK/
- HTTPS://amigos de Ano Novo.IO/labs/CAA-validator
7. Atualize automaticamente os certificados SSL regularmente
Se você deseja atualizar manualmente:
# RSA
$ acme.sh --renew -d wzfou.com –d www.wzfou.com --force
# ECC
acme.sh --renew -d wzfou.com –d www.wzfou.com --force --ecc
Geralmente, acme.sh adicionou automaticamente tarefas agendadas para atualizar regularmente o certificado Let’s Encrypt. Se você descobrir que o certificado não é atualizado regularmente, verifique se sua tarefa Cron está correta.
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force
8. Verifique a configuração do certificado SSL
Os sites de teste comumente usados incluem:
- HTTPS://wuwuwu.SSL labs.com/SSL test/analyze.HTML
- https://nokill.com/
É altamente recomendável usar ssllabs.com. Os resultados do teste ainda são muito precisos, como segue:
9. Abrangente
Com base nas estratégias de otimização acima, a otimização específica do arquivo de configuração Nginx é a seguinte:
server {
listen 443 ssl http2;
#使用HTTP/2,需要Nginx1.9.7以上版本
add_header Strict-Transport-Security "max-age=6307200; includeSubdomains; preload";
#开启HSTS,并设置有效期为“6307200秒”(6个月),包括子域名(根据情况可删掉),预加载到浏览器缓存(根据情况可删掉)
add_header X-Frame-Options DENY;
#禁止被嵌入框架
add_header X-Content-Type-Options nosniff;
#防止在IE9、Chrome和Safari中的MIME类型混淆攻击
ssl_certificate /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.crt;
ssl_certificate_key /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.key;
#SSL证书文件位置
ssl_trusted_certificate /usr/local/nginx/conf/vhost/sslkey/chaine.pem;
#OCSP Stapling的证书位置
ssl_dhparam /usr/local/nginx/conf/vhost/sslkey/dhparam.pem;
#DH-Key交换密钥文件位置
#SSL优化配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#只允许TLS协议
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
#加密套件,这里用了CloudFlare's Internet facing SSL cipher configuration
ssl_prefer_server_ciphers on;
#由服务器协商最佳的加密算法
ssl_session_cache builtin:1000 shared:SSL:10m;
#Session Cache,将Session缓存到服务器,这可能会占用更多的服务器资源
ssl_session_tickets on;
#开启浏览器的Session Ticket缓存
ssl_session_timeout 10m;
#SSL session过期时间
ssl_stapling on;
#OCSP Stapling开启,OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高TLS握手速度
ssl_stapling_verify on;
#OCSP Stapling验证开启
resolver 8.8.8.8 8.8.4.4 valid=300s;
#用于查询OCSP服务器的DNS
resolver_timeout 5s;
#查询域名超时时间
···
}
Durante o uso real, verifica-se que as "otimizações" individuais devem ser determinadas de acordo com as próprias necessidades. A seguir está a configuração Nginx atualmente usada por wzfou.com, apenas para referência:
listen 80;
listen 443 ssl http2;
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_stapling on;
ssl_stapling_verify on;
PS: Atualizado em 5 de agosto de 2018 Obrigado ao xiaoz pelo lembrete. Aqui está um site para gerar configuração SSL online, da Mozilla, que é muito referenciável:
- https://Mozilla.GitHub.IO/server-dead-torres/ratings-config-generator/