Poiché la consapevolezza di tutti sulla sicurezza online aumenta e le principali società Internet promuovono la divulgazione di HTTPS, HTTPS SSL è diventato sostanzialmente lo standard per la creazione di siti Web. Grazie ai certificati SSL gratuiti forniti da Let’s Encrypt, Digicert, TrustAsia, Symantec, ecc., il costo dell’utilizzo di HTTPS è ora trascurabile sia che si tratti di un sito Web personale che di un sito Web aziendale.
Per motivi di sicurezza, dobbiamo utilizzare HTTPS, ma l'attivazione di SSL aumenterà il sovraccarico di memoria, CPU e larghezza di banda della rete. Rispetto a http, utilizzando l'handshake a tre vie TCP per stabilire una connessione, il client e il server devono scambiare 3 pacchetti Oltre ai tre pacchetti TCP, https necessita anche di 9 pacchetti necessari per l'handshake SSL, per un totale di 12. pacchetti. Pertanto, se HTTPS è molto ottimizzato, è incline a rallentare le prestazioni.
Naturalmente, alcune persone potrebbero pensare che l'aumento del sovraccarico del server dovuto a HTTPS e SSL non venga sostanzialmente percepito. Questo perché il traffico del sito Web è relativamente piccolo e la configurazione delle prestazioni del server è sufficiente per supportare il traffico attuale. Ma per i siti web di grandi dimensioni, come Baidu, Google e le app più diffuse, è comunque molto utile ottimizzare le prestazioni HTTPS e ridurre il consumo di risorse.
Questo articolo condividerà alcune esperienze sull'ottimizzazione dell'uso di HTTPS e SSL. Sono disponibili tutorial più esperti sui certificati SSL e HTTPS:
- Raccolta e riepilogo gratuiti dei certificati SSL: aggiungi gratuitamente l'accesso crittografato sicuro HTTPS al sito Web
- Dieci suggerimenti gratuiti per l'accelerazione CDN di CloudFlare che potresti non conoscere: SSLDDOSCache
- Abilita HSTS e iscriviti all'elenco di precaricamento HSTS per rendere più sicuro l'accesso HTTPS al sito Web, con metodi per eliminare HSTS
PS: aggiornato il 6 settembre 2018, se desideri utilizzare un servizio di risoluzione DNS a pagamento, ecco due servizi DNS più economici e più adatti ai privati: Due prodotti DNS adatti all'uso personale: ClouDNS e DNS Risoluzione dei nomi di dominio semplificata.
PS: aggiornato il 15 gennaio 2019, Se desideri l'accesso SSL per ottenere velocità più elevate e prestazioni più elevate, puoi provare la compressione TLSV1.3 e Brotli: accelerazione dell'ottimizzazione del sito Web: attiva la compressione TLSV1.3 e Brotli -Pannello OneInstack, LNMP, Pagoda.
1. Come scegliere un certificato SSL gratuito?
Si consiglia di scegliere Crittografiamo. Sebbene il certificato SSL gratuito Let's Encrypt abbia una durata di soli 90 giorni, può essere rinnovato indefinitamente e supporta il rinnovo manuale e automatico. Let's Encrypt SSL è riconosciuto da tutti i principali browser ed è la prima scelta per i certificati SSL gratuiti. Tutorial: Crittografiamo l'applicazione con un clic del certificato SSL per il nome di dominio gratuito con caratteri jolly e tutorial sull'utilizzo di SSL.
Let's Encrypt è adatto per host con IP indipendenti come VPS. Altrimenti, puoi utilizzare solo alcune applicazioni di certificato SSL online sviluppate utilizzando l'API Let's Encrypt. Naturalmente, se hai una certa solidità finanziaria, è più fattibile scegliere un certificato SSL a pagamento. Per ulteriori certificati SSL, vedi: Raccolta e riepilogo dei certificati SSL gratuiti.
2. Abilita HSTS sul server
I siti Web che utilizzano il protocollo HSTS garantiranno che il browser si connetta sempre alla versione HTTPS del sito Web, senza richiedere agli utenti di inserire manualmente un indirizzo crittografato contenente https://
nella barra degli indirizzi URL. Utilizzo il server Nginx, devo solo modificare il file di configurazione Nginx (come: /usr/local/nginx/conf/nginx.conf) e aggiungere le seguenti righe al blocco server della configurazione HTTPS:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
Per dettagli su come abilitare HSTS per Apache, Lighttpd, ecc., vedere: Abilita HSTS sul server.
3. Aggiungi il nome di dominio al piano dell'elenco di precaricamento HSTS
Sebbene il protocollo HSTS sia abilitato sopra per garantire che gli utenti accedano sempre alle connessioni HTTPS, generalmente gli utenti che visitano il sito web per la prima volta inseriranno abitualmente nomi di dominio non https, il che porta al problema del dirottamento http quando visitano il sito web per la prima volta. tempo. Il piano dell'elenco di precaricamento HSTS serve a risolvere questo problema. Si tratta di un elenco integrato in browser come ChromeFirefoxEdge.
Come iscriversi all'elenco di precaricamento HSTS: Abilita HSTS e iscriviti all'elenco di precaricamento HSTS per rendere più sicuro l'accesso HTTPS al sito Web: in allegato è riportato il metodo per eliminare HSTS. Al momento, wzfou.com è stato aggiunto con successo all'elenco di precaricamento HSTS. Se utilizzi Chrome o Firefox, la prima volta che visiti questo sito, utilizzerai HTTPS per la connessione per impostazione predefinita.
Abilita pinzatura OCSP in Nginx. (ssl_trusted_certificate può essere omesso se la direttiva ssl_certificate specifica la catena completa di certificati)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certs/chained.pem;
Abilita pinzatura OCSP in Apache:
In <VirtualHost></VirtualHost>
aggiungi:
SSLUseStapling on
All'esterno di <VirtualHost></VirtualHost>
aggiungi:
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
5. Utilizzare i certificati doppi ECC e RSA
Per impostazione predefinita, utilizzeremo tutti i certificati RSA perché i certificati RSA hanno la più ampia compatibilità. Tuttavia, il certificato ECC ha le caratteristiche di dimensioni ridotte, elevata velocità di elaborazione ed elevata sicurezza (la chiave ECC
a 256 bit può fornire la stessa sicurezza della chiave RSA
a 3072 bit). Può Fornisce prestazioni HTTPS in una certa misura.
Let's Encrypt supporta già la generazione di certificati ECC. Utilizza acme.sh per emettere certificati SSL. Specifica --keylength ec-256
per modificare il tipo di certificato in ECC:
acme.sh --issue -w /data/wwwroot/wzfou.com -d wzfou.com -d www.wzfou.com --keylength ec-256
Va notato che ECC non è compatibile con Windows XP Al momento penseremo all'utilizzo di certificati doppi. Cioè, quando il certificato ECC non è supportato, Nginx mostrerà automaticamente all'utente il certificato RSA. Se la versione di nginx è successiva a 1.11
, puoi scrivere direttamente i percorsi dei certificati doppi ECC e RSA nel file di configurazione wzfou.com come segue:
#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;
Riavvia Nginx Quando utenti come XP che non supportano i certificati ECC accedono al sito Web, viene visualizzato il certificato RSA.
Altri utenti preferiscono utilizzare i certificati ECC.
Se trovi che ECC non viene visualizzato preferenzialmente, controlla se ssl_prefer_server_ciphers
è abilitato e se ssl_ciphers
è configurato correttamente Quella che segue è la configurazione utilizzata da wzfou.com:
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;
Inoltre, puoi scegliere una delle tre opzioni seguenti (solo per i test):
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. Abilita CAA DNS
La funzione della CAA DNS è quella di consentire solo alla CA elencata nel record di emettere certificati per il nome di dominio (o nome di sottodominio) per impedire a qualcuno di falsificare i certificati SSL. Allo stesso tempo, il record CAA può controllare l'emissione di un singolo dominio denominare i certificati SSL e può anche controllare il certificato con caratteri jolly. Per i metodi dettagliati, vedere: Impostazioni DNS JD Cloud CAA.
Problema:L'abilitazione della CAA DNS genera un errore: Verifica errore: record CAA per l'emissione di *.wzfou.comprevents. La soluzione è aggiungere il record issuewild
: 0 issuewild "letsencrypt.org"
. Inoltre, vengono forniti due siti Web per verificare se la configurazione CAA è corretta:
- HTTPS://CAA test.co.UK/
- HTTPS://Friends.IO/labs/CAA-validator di Capodanno
7. Aggiorna automaticamente e regolarmente i certificati SSL
Se desideri aggiornare 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
In genere, acme.sh ha aggiunto automaticamente attività pianificate per aggiornare regolarmente il certificato Let's Encrypt. Se scopri che il certificato non viene aggiornato regolarmente, controlla se l'attività Cron è corretta. Puoi anche provare a forzare un aggiornamento:
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force
8. Controlla la configurazione del certificato SSL
I siti Web di test comunemente utilizzati includono:
- HTTPS://wuwuwu.SSL labs.com/SSL test/analyze.HTML
- https://nokill.com/
Si consiglia vivamente di utilizzare ssllabs.com. I risultati del test sono ancora molto accurati, come segue:
9. Completo
Sulla base delle strategie di ottimizzazione di cui sopra, l'ottimizzazione specifica del file di configurazione Nginx è la seguente:
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 l'uso effettivo, si scopre che le "ottimizzazioni" individuali devono essere determinate in base alle proprie esigenze. Quella che segue è la configurazione Nginx attualmente utilizzata da wzfou.com, solo come riferimento:
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: aggiornato il 5 agosto 2018 Grazie a xiaoz per il promemoria Ecco un sito Web per generare la configurazione SSL online, da Mozilla, che è molto consultabile:
- https://Mozilla.GitHub.IO/server-dead-torres/ratings-config-generator/