Da das Bewusstsein aller für Online-Sicherheit zunimmt und große Internetunternehmen die Verbreitung von HTTPS vorantreiben, ist HTTPS SSL mittlerweile im Grunde zum Standard für die Erstellung von Websites geworden. Dank der kostenlosen SSL-Zertifikate von Let’s Encrypt, Digicert, TrustAsia, Symantec usw. sind die Kosten für die Verwendung von HTTPS jetzt vernachlässigbar, egal ob es sich um eine persönliche Website oder eine Unternehmenswebsite handelt.
Aus Sicherheitsgründen müssen wir HTTPS verwenden, aber die Aktivierung von SSL erhöht den Overhead an Speicher, CPU und Netzwerkbandbreite. Im Vergleich zu http müssen Client und Server bei Verwendung des TCP-Drei-Wege-Handshakes zum Herstellen einer Verbindung 3 Pakete austauschen. Zusätzlich zu den drei Paketen von TCP benötigt HTTP auch 9 Pakete, die für den SSL-Handshake erforderlich sind, also insgesamt 12 Pakete. Wenn HTTPS daher stark optimiert ist, ist es anfällig für eine langsame Leistung.
Natürlich denken einige Leute vielleicht, dass der erhöhte Server-Overhead von HTTPS und SSL grundsätzlich nicht spürbar ist. Dies liegt daran, dass der Datenverkehr auf der Website relativ gering ist und die Leistungskonfiguration des Servers ausreicht, um den aktuellen Datenverkehr zu unterstützen. Aber für große Websites wie Baidu, Google und beliebte Apps ist es immer noch sehr nützlich, die HTTPS-Leistung zu optimieren und den Ressourcenverbrauch zu reduzieren.
In diesem Artikel werden einige Erfahrungen bei der Optimierung der Verwendung von HTTPS und SSL weitergegeben. Es gibt weitere Erfahrungs-Tutorials zu SSL-Zertifikaten und HTTPS:
- Kostenlose Sammlung und Zusammenfassung von SSL-Zertifikaten – fügen Sie kostenlos einen sicheren, verschlüsselten HTTPS-Zugriff auf die Website hinzu
- Zehn kostenlose CloudFlare-CDN-Beschleunigungstipps, die Sie vielleicht nicht kennen – SSLDOSCache
- Aktivieren Sie HSTS und treten Sie der HSTS-Preload-Liste bei, um den HTTPS-Zugriff auf die Website sicherer zu machen – mit Methoden zum Löschen von HSTS
PS: Aktualisiert am 6. September 2018: Wenn Sie einen kostenpflichtigen DNS-Auflösungsdienst nutzen möchten, finden Sie hier zwei günstigere DNS-Dienste, die besser für Einzelpersonen geeignet sind: Zwei DNS-Produkte, die für den persönlichen Gebrauch geeignet sind: ClouDNS und DNS Einfache Auflösung von Domainnamen.
PS: Aktualisiert am 15. Januar 2019, Wenn Sie möchten, dass der SSL-Zugriff schneller und leistungsfähiger wird, können Sie TLSV1.3 und Brotli-Komprimierung ausprobieren: Beschleunigung der Website-Optimierung – aktivieren Sie TLSV1.3 und Brotli-Komprimierung -Oneinstack, LNMP, Pagodenpanel.
1. Wie wähle ich ein kostenloses SSL-Zertifikat aus?
Es wird empfohlen, Let’s Encrypt zu wählen. Obwohl das kostenlose SSL-Zertifikat von Let’s Encrypt nur 90 Tage gültig ist, kann es auf unbestimmte Zeit verlängert werden und unterstützt manuelle und automatische Verlängerung. Let’s Encrypt SSL wird von allen gängigen Browsern erkannt und ist die erste Wahl für kostenlose SSL-Zertifikate. Tutorial: Let's Encrypt Wildcard-freies SSL-Zertifikat für Domainnamen, Ein-Klick-Anwendung und Tutorial zur SSL-Nutzung.
Let’s Encrypt ist für Hosts mit unabhängigen IPs wie VPS geeignet. Ansonsten können Sie nur einige Online-SSL-Zertifikatsanwendungen verwenden, die mit der Let’s Encrypt API entwickelt wurden. Wenn Sie über eine gewisse Finanzkraft verfügen, ist es natürlich sinnvoller, ein kostenpflichtiges SSL-Zertifikat zu wählen. Weitere SSL-Zertifikate finden Sie unter: Sammlung und Zusammenfassung kostenloser SSL-Zertifikate.
2. Aktivieren Sie HSTS auf dem Server
Websites, die das HSTS-Protokoll verwenden, stellen sicher, dass der Browser immer eine Verbindung zur HTTPS-Version der Website herstellt, ohne dass Benutzer manuell eine verschlüsselte Adresse mit https://
in die URL-Adressleiste eingeben müssen. Ich verwende den Nginx-Server. Ich muss nur die Nginx-Konfigurationsdatei bearbeiten (z. B.: /usr/local/nginx/conf/nginx.conf) und die folgenden Zeilen zum Serverblock der HTTPS-Konfiguration hinzufügen:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
Einzelheiten zum Aktivieren von HSTS für Apache, Lighttpd usw. finden Sie unter: HSTS auf dem Server aktivieren.
3. Fügen Sie den Domänennamen zum HSTS-Preload-Listenplan hinzu
Obwohl das HSTS-Protokoll oben aktiviert ist, um sicherzustellen, dass Benutzer immer auf HTTPS-Verbindungen zugreifen, geben Benutzer, die die Website zum ersten Mal besuchen, im Allgemeinen nicht-https-Domänennamen ein, was beim ersten Besuch der Website zum Problem des HTTP-Hijackings führt Zeit. Der HSTS-Preload-Listenplan soll dieses Problem lösen. Es handelt sich um eine integrierte Liste in Browsern wie chromeFirefoxEdge.
So treten Sie der HSTS-Preload-Liste bei: Aktivieren Sie HSTS und treten Sie der HSTS-Preload-Liste bei, um den HTTPS-Zugriff auf die Website sicherer zu machen. Im Anhang finden Sie die Methode zum Löschen von HSTS. Derzeit wurde wzfou.com erfolgreich zur HSTS-Preload-Liste hinzugefügt. Wenn Sie Chrome oder Firefox verwenden, verwenden Sie beim ersten Besuch dieser Website standardmäßig HTTPS.
OCSP-Stapling aktivieren in Nginx. (ssl_trusted_certificate kann weggelassen werden, wenn die ssl_certificate-Direktive die vollständige Zertifikatskette angibt)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certs/chained.pem;
OCSP-Stapling aktivieren in Apache:
Fügen Sie in <VirtualHost></VirtualHost>
Folgendes hinzu:
SSLUseStapling on
Außerhalb von <VirtualHost></VirtualHost>
hinzufügen:
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
5. Verwenden Sie ECC- und RSA-Doppelzertifikate
Standardmäßig verwenden wir alle RSA-Zertifikate, da RSA-Zertifikate die größte Kompatibilität aufweisen. Das ECC-Zertifikat zeichnet sich jedoch durch geringe Größe, schnelle Rechengeschwindigkeit und hohe Sicherheit aus (256-Bit-ECC-Schlüssel
kann die gleiche Sicherheit bieten wie der 3072-Bit-RSA-Schlüssel
) . Es kann bis zu einem gewissen Grad HTTPS-Leistung bereitstellen.
Let’s Encrypt unterstützt bereits die Generierung von ECC-Zertifikaten. Verwenden Sie acme.sh, um SSL-Zertifikate auszustellen. Geben Sie --keylength ec-256
an, um den Zertifikatstyp in ECC zu ändern.
acme.sh --issue -w /data/wwwroot/wzfou.com -d wzfou.com -d www.wzfou.com --keylength ec-256
Es ist zu beachten, dass ECC unter Windows XP nicht kompatibel ist. Zu diesem Zeitpunkt werden wir über die Verwendung von Doppelzertifikaten nachdenken. Das heißt, wenn das ECC-Zertifikat nicht unterstützt wird, zeigt Nginx dem Benutzer automatisch das RSA-Zertifikat an. Wenn die Version von nginx größer als 1.11
ist, können Sie die Pfade der ECC- und RSA-Dual-Zertifikate direkt in die Konfigurationsdatei schreiben, wie wzfou.com zeigt:
#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;
Starten Sie Nginx neu. Wenn Benutzer wie XP, die keine ECC-Zertifikate unterstützen, auf die Website zugreifen, wird das RSA-Zertifikat angezeigt.
Andere Benutzer bevorzugen die Verwendung von ECC-Zertifikaten.
Wenn Sie feststellen, dass ECC nicht bevorzugt angezeigt wird, überprüfen Sie, ob ssl_prefer_server_ciphers
aktiviert ist und ob ssl_ciphers
richtig konfiguriert ist. Die folgende Konfiguration wird von wzfou.com verwendet:
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;
Darüber hinaus können Sie eine der folgenden drei Optionen auswählen (nur zum Testen):
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. Aktivieren Sie DNS CAA
Die Funktion von DNS CAA besteht darin, nur der im Eintrag aufgeführten Zertifizierungsstelle die Ausstellung von Zertifikaten für den Domänennamen (oder Subdomänennamen) zu ermöglichen, um zu verhindern, dass jemand SSL-Zertifikate fälscht. Gleichzeitig kann der CAA-Eintrag die Ausstellung einzelner Domänen steuern benennen SSL-Zertifikate und können auch Wildcard-Zertifikate steuern. Detaillierte Methoden finden Sie unter: JD Cloud DNS-Einstellungen CAA.
Problem:Das Aktivieren von DNS CAA führt zu einem Fehler: Überprüfen Sie den Fehler: CAA-Eintrag für *.wzfou.com verhindert die Ausstellung. Die Lösung besteht darin, den Datensatz issuewild
hinzuzufügen: 0 issuewild "letsencrypt.org"
. Darüber hinaus werden zwei Websites bereitgestellt, um zu überprüfen, ob die CAA-Konfiguration korrekt ist:
- HTTPS://CAA test.co.UK/
- HTTPS://Silvesterfreunde.IO/labs/CAA-validator
7. SSL-Zertifikate regelmäßig automatisch aktualisieren
Wenn Sie manuell aktualisieren möchten:
# 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
Im Allgemeinen hat acme.sh automatisch geplante Aufgaben hinzugefügt, um das Let’s Encrypt-Zertifikat regelmäßig zu aktualisieren. Überprüfen Sie, ob Ihre Cron-Aufgabe korrekt ist. Sie können auch versuchen, eine Aktualisierung zu erzwingen.
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force
8. Überprüfen Sie die Konfiguration des SSL-Zertifikats
Zu den häufig verwendeten Test-Websites gehören:
- HTTPS://wuwuwu.SSL labs.com/SSL test/analyze.HTML
- https://nokill.com/
Es wird dringend empfohlen, ssllabs.com zu verwenden. Die Testergebnisse sind immer noch sehr genau, wie folgt:
9. Umfassend
Basierend auf den oben genannten Optimierungsstrategien ist die spezifische Optimierung der Nginx-Konfigurationsdatei wie folgt:
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;
#查询域名超时时间
···
}
Bei der tatsächlichen Nutzung stellt sich heraus, dass individuelle „Optimierungen“ entsprechend den eigenen Bedürfnissen ermittelt werden müssen. Das Folgende ist die derzeit von wzfou.com verwendete Nginx-Konfiguration, nur als Referenz:
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: Aktualisiert am 5. August 2018 Vielen Dank an xiaoz für die Erinnerung. Hier ist eine Website zum Online-Generieren von SSL-Konfigurationen, die sehr referenzierbar ist:
- https://Mozilla.GitHub.IO/server-dead-torres/ratings-config-generator/