it-swarm.com.de

Empfohlene ssl_ciphers für Sicherheit, Kompatibilität - Perfect Forward-Geheimhaltung

Ich verwende derzeit Nginx mit den folgenden Chiffren:

ssl_ciphers HIGH:!aNULL:!eNULL:!LOW:!ADH:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;

Ich möchte die Kompatibilität mit älteren Browsern, insbesondere auch älteren mobilen Browsern, beibehalten und SHA1 daher nicht vollständig verbieten.

Wie kann ich erreichen, dass SHA256 gegenüber SHA1 für MAC (Message Authentication Code) bevorzugt und immer verwendet wird, wenn dies möglich ist?.

Ich kann das Anwenden von SHA256 erzwingen, indem ich SHA256 :! SHA: zu meiner Zeichenfolge ssl_ciphers hinzufüge, aber dies würde SHA1 auch vollständig verbieten.

Mit der ssl_cipher am Anfang wird jedoch meist nur SHA1 verwendet. Irgendwelche Empfehlungen?


Update 29.12.2014

Vielen Dank an alle für die konstruktiven Beiträge und Diskussionen.

Auch wenn ich immer noch der Meinung bin, dass die Mozilla-Seite auf der serverseitigen TLS das Thema insgesamt recht gut abdeckt, würde ich die moderne Kompatibilität nur mit der Einschränkung empfehlen, dass die DSS-Chiffren sollten entfernt und ausdrücklich nicht zugelassen werden (! DSS), wie im Kommentar von Anti-Schwachpasswörtern empfohlen - danke, dass Sie es entdeckt haben.

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: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-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK

Interessanterweise hat ssllabs dies nicht alarmiert oder die Rate gesenkt ...

Außerdem bevorzuge ich die Verwendung von benutzerdefinierten Diffie Hellman-Parametern. Auch wenn die Standard offensichtlich als sicher gelten. Was sind die OpenSSL-Standard-Diffie-Hellmann-Parameter (Primzahlen)?

openssl dhparam -check -out /etc/ssl/private/dhparams.pem 2048

erhöhen Sie das auf 4096 für Paranoia und Spaß, wenn Sie möchten.

36
binaryanomaly

Lassen Sie uns zunächst kurz erläutern, wie die Aushandlung von Chiffresuiten funktioniert. Zum Beispiel können wir das TLS 1.2-Dokument RFC 5246 ab Abschnitt 7.4.1.2 verwenden, um in der kurzen Kurzform zu sehen:

  • ClientHello: Der Client teilt dem Server mit, welche Chiffresuiten der Client unterstützt
  • Jetzt wählt der Server einen
    • Ich werde diskutieren, wie man steuert, welches als nächstes ausgewählt wird!
  • ServerHello: Der Server teilt dem Client mit, welche Cipher Suite er ausgewählt hat, oder gibt dem Client eine Fehlermeldung.

Nun zur eigentlichen Auswahl. Ich habe das Dokumentation zum Nginx-SSL-Modul , das Qualys 2013-Artikel zum Konfigurieren von Apache, Nginx und OpenSSL für die Weiterleitungsgeheimnis und das Hynek Hardening Your Web) verwendet SSL-Chiffren des Servers Artikel als Referenz. Die beiden letzteren decken sowohl Apache als auch Nginx ab (da beide OpenSSL als Basis verwenden).

Im Wesentlichen müssen Sie Nginx anweisen, die von Ihnen ausgewählte Reihenfolge zu verwenden, und Sie müssen eine Bestellung auswählen. Um zu sehen, wie die Ergebnisse dieser Reihenfolge aussehen würden, können Sie die OpenSSL-Befehlszeile verwenden, z.

openssl ciphers -v 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED'

HINWEIS: Möglicherweise möchten Sie Folgendes entfernen :! 3DES aus dieser Zeichenfolge; 3-Schlüssel-Triple-DES ist nicht effizient, aber an und für sich sicher für mehr oder weniger 112 Bit Sicherheit und sehr, sehr häufig.

Verwenden Sie den obigen Befehl, um zu bestimmen, welche Cipher Suites in Ihrer Konfiguration am meisten bevorzugt und am wenigsten bevorzugt werden, und ändern Sie ihn, bis Ihnen die Ergebnisse gefallen. Die Referenzen, die ich gegeben habe, haben ihre eigenen Zeichenfolgen; Ich habe es leicht geändert, um das obige Beispiel zu erhalten (Entfernen von RC4 und SEED und Platzieren jeder TLS 1.2-Verschlüsselungssuite beispielsweise über jeder 'SSLv3'-Verschlüsselungssuite).

Dann würden Sie insbesondere für Nginx Ihre Konfigurationsdatei so ändern, dass sie Folgendes enthält:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED";

Fügen Sie ssl_protocols SSLv3 hinzu, wenn Sie wirklich darauf bestehen.

Die ssl_prefer_server_ciphers informieren nginx über die Verwendung der von uns angegebenen Reihenfolge und ignorieren die Reihenfolge, in der der Client seine Verschlüsselungsliste präsentiert. Wenn nun die einzige gemeinsam genutzte Verschlüsselungssuite zwischen ClientHello und der Liste OpenSSL-Verschlüsselungen -v ... unsere am wenigsten bevorzugte ist Chiffre, das wird natürlich Nginx verwenden. Wenn nichts übereinstimmt, senden wir dem Kunden eine Fehlerbenachrichtigung.

Der Befehl ssl_ciphers ist hier das Fleisch der Wahl, da nginx OpenSSL über unsere bevorzugte Cipher Suite-Liste informiert. Bitte verwenden Sie den Befehl openssl ciphers -v, um die Ergebnisse anzuzeigen, die Sie auf Ihrer Plattform erhalten. Überprüfen Sie es im Idealfall erneut, nachdem Sie die OpenSSL-Versionen geändert haben.

Lesen Sie auch Scott Helmes Artikel zum Einrichten von HSTS (HTTP Strict Transport Security) in nginx , mit dem ein Host die Verwendung von HTTPS auf der Clientseite erzwingen kann. Stellen Sie sicher, dass der HSTS-Header im http-Block mit der Anweisung ssl listen enthalten ist.

Bearbeitet, um hinzuzufügen: Zumindest danach (wenn nicht vorher auch) gehen Sie zu Qualys SSL Labs , um HTTPS-Sicherheitsinformationen anzuzeigen, und zu Testen Sie Ihren Server , das ziemlich gut auf dem neuesten Stand gehalten wurde bis heute für die letzten Jahre. Empfehlungen ändern sich regelmäßig und kehren sich manchmal sogar häufig um (RC4 zum Beispiel, was fast Schleudertrauma auslöst). Sie können auch sogar Testen Sie Ihren Browser !

27

Mozilla verfügt über ein Online-Tool, mit dem Sie die richtige Verschlüsselungssuite auswählen können.

https://mozilla.github.io/server-side-tls/ssl-config-generator/

Hier können Sie Ihre Serverversion, Softwareversion usw. eingeben und dann zwischen einem Gleichgewicht zwischen Sicherheit und Legacy-Unterstützung wählen.

8
Alex W

für beste Kompatibilität ist die Cloudflare-Cipher-Suite nicht die beste. ich fand folgendes besser:

# suggestion from sslabs / including PFS, good compatibility
#ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;


# suggestion my mozilla-server-team - good compatibility, pfs
#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:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;

wenn Sie jedes Setup mit ssllabs überprüfen, finden Sie für diese beiden Suiten die folgende Anweisung:

  • Geheimhaltung weiterleiten Ja (mit den meisten Browsern) ROBUST

auf Ihrer vorgeschlagenen cipher_suite heißt es:

  • Weiterleitungsgeheimnis Ja (mit modernen Browsern)

zusätzliche Informationen: Anleitung zu Nginx + SSL + SPDY

OpenSSL bevorzugt natürlich neuere MACs für ansonsten äquivalente Cipher Suites. Die lange Ausgabe von openssl ciphers -v Für Ihre Chiffrierzeichenfolge beginnt beispielsweise mit:

ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH        Au=RSA    Enc=AESGCM(256)    Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH        Au=ECDSA  Enc=AESGCM(256)    Mac=AEAD
ECDHE-RSA-AES256-SHA384        TLSv1.2  Kx=ECDH        Au=RSA    Enc=AES(256)       Mac=SHA384
ECDHE-ECDSA-AES256-SHA384      TLSv1.2  Kx=ECDH        Au=ECDSA  Enc=AES(256)       Mac=SHA384
ECDHE-RSA-AES256-SHA           SSLv3    Kx=ECDH        Au=RSA    Enc=AES(256)       Mac=SHA1
ECDHE-ECDSA-AES256-SHA         SSLv3    Kx=ECDH        Au=ECDSA  Enc=AES(256)       Mac=SHA1

Natürlich verwendet TLS nur Cipher Suites, die sowohl vom Server als auch vom Client unterstützt werden, und weder Chrome noch Firefox unterstützen HMAC-SHA256-Cipher Suites. Seit HMAC-SHA1 (und sogar HMAC-MD5)) Ich glaube, ihre Entwickler (und die von NSS, der TLS-Bibliothek, die beide verwenden) sind skeptisch, Entwickleraufwand und TLS-Handshake-Größe zu verschwenden, indem sie neue, unnötige und abwärts inkompatible Cipher Suites hinzufügen.

Schauen Sie sich zum Beispiel Die von Chrome 33 unterstützten Cipher Suites in der Reihenfolge ihrer Präferenz an :

  1. ChaCha20-Poly1305 ,
  2. AES-128-GCM,
  3. AES-256-CBC mit HMAC-SHA1,
  4. RC4 (ugh) und AES-128-CBC mit HMAC-SHA1, ...

OpenSSL unterstützt ChaCha20-Poly1305 nicht. Wenn Ihr AES-GCM auch nicht unterstützt (???) und ein RSA-Zertifikat verwendet, ist ECDHE-RSA-AES256-SHA Natürlich die Verschlüsselungssuite Chrome wird verwendet. (Firefox 29 würde verwenden ECDHE-RSA-AES128-SHA.)

(Die "SHA-256" -Verschlüsselungssuiten, die Sie auf anderen Websites verwendet haben, sind vermutlich ChaCha20-Poly1305 oder AES-128-GCM, bei denen es sich um AEADs handelt, die HMAC nicht verwenden. aber deren Chiffresuiten verwenden SHA-256 im [~ # ~] prf [~ # ~] .)

3
Matt Nordhoff

https://cipherli.st/ ist eine weitere Website, die Folgendes bietet:

Die oben genannten Chiffren können in Ihrer Nginx-, Lighttpd- oder Apache-Konfiguration kopiert werden. Diese bieten eine starke SSL-Sicherheit für alle modernen Browser. Außerdem erhalten Sie beim SSL Labs-Test ein A +.

Dieses Zeug ist die ganze Zeit veraltet, aber für das, was es wert ist, im Mai 2018 hier seine Empfehlungen für Nginx:

ssl_protocols TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on; 
ssl_dhparam /etc/nginx/dhparam.pem; # openssl dhparam -out /etc/nginx/dhparam.pem 4096
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
2
artfulrobot

Die Empfehlung von Comodo lautet:

ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

Quelle: https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/789/37/

2
Michael

Die Wahl der Hash-Funktion (SHA-1 vs SHA-256) hängt nicht wirklich von der Cipher Suite ab, sondern von der Protokollversion . Grundsätzlich erhalten Sie SHA-256, wenn Sie TLS 1.2 verwenden, SHA-1, wenn Sie eine ältere Version verwenden.

(Ja, ich wusste, dass dies eine vereinfachte Beschreibung einer etwas komplexeren Situation ist, aber hier funktioniert es.)

Normalerweise verwenden Client und Server die höchste Protokollversion, die beide unterstützen. Daher sollten Sie TLS-1.2 (daher SHA-256) bereits erhalten, wann immer dies möglich ist. Beachten Sie, dass hierfür sowohl der Servercode (OpenSSL) als auch der Clientcode aktuell sein müssen. Sie können diesen Mechanismus explizit mit ssl_protocols .

1
Tom Leek