2016-04-01 12 views
4

Ich Begrenzung der Chiffren, die meine Webservice nur auf diese TLS 1.x Chiffren erlaubt:Ist die Reihenfolge der Chiffre-Namen in TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList wichtig?

TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
TLS_RSA_WITH_ CAMELLIA_256_CBC_SHA
TLS_RSA_WITH_IDEA_CBC_SHA
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_RC4_128_SHA

aktualisieren als Antwort auf Dave Thompson ‚s Kommentar:

Ich nehme jetzt die generierten Chiffren aus this SO answer, in dieser Reihenfolge.
Da wir derzeit Delphi XE2/Indy 10.5.8.0/OpenSSL 1.0.2f verwenden, verlasse ich die ECDHE-Chiffren, diese sind too cumbersome to implement with these software versions.
Wir erlauben auch weiterhin TLS 1.0. .
Nach dem Update auf Delphi Seattle 10 wir TLS 1.0 nicht zulassen würden und die ECDHE Chiffren in setzen

Dies läßt:

TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc15) 
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x9f) 
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x9e) 
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x6b) 
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x67) 
TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 (0xc4) 
TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x39) 
TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x33) 
TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (0x88) 
TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (0x45) 

Umgewandelt in OpenSSL Namen (nach Mapping OpenSSL cipher suite names to RFC names) ist dies:

Die Reihenfolge, in der ein Server Verschlüsselungen anbietet, ist wichtig, aber habe ich die Kontrolle über diese Bestellung? Der CipherList ist eine String-Eigenschaft, diesen Namen enthält, mit ‚+‘ verketteten:

TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList := 'DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SH:DHE-RSA-AES128-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-CAMELLIA128-SHA256'; 

Wenn ja, was ist die empfohlene Reihenfolge?

Beachten Sie, dass, da mein Webservice der Server ist, ich SSLOptions.Mode := sslmServer eingestellt habe.

* Dies sind diejenigen, die nmap Skript ssl-enum-ciphers Typen mit einem 'A'

+0

Ich weiß nicht, wie das nmap-Skript benotet, aber A für ** RC4 ist sehr falsch **; es ist so stark geschwächt durch zahlreiche Angriffe, dass es kürzlich offiziell für TLS verboten wurde, siehe Wikipedia für Details und Links. Und wenn 'DHE-RSA ... (dh 256)' eine DHE-Gruppe von 256 Bits bedeutet, ist das * grob * unsicher - es ist ungefähr so, als ob Logjam gewürfelt wäre! Wenn Sie Sicherheit wünschen, http://security.stackexchange.com/questions/51680/optimal-web-server-ssl-cipher-suite-configuration und http://security.stackexchange.com/questions/76993/now-that -it-is-2015-what-ssl-tls-cipher-suits-sollte-verwendet- –

+0

@ dave_thompson_085 Danke, aktualisiert die Liste. –

+0

Re update: überprüfen Sie auch DHparams Größe, wenn Sie nicht haben. Ich weiß nicht, ob dein openssl-Build gepatcht ist, aber Upstream 1.0.2 unterstützt weder CHACHA noch CAMELLIA mit SHA2; Die Website zeigt 1.1.0 (jetzt in der Betaversion) wird (anscheinend alle) CHACHA und CAMELLIA-SHA2 nur mit ECDHE haben (nicht DHE, oder eben plainRSA). Beachten Sie, dass OpenSSL stillschweigend ignorierte Elemente in einem Chiffrierstring ignoriert, solange mindestens ein Element gültig ist und eine nicht leere Liste erstellt. –

Antwort

5

Ist die Reihenfolge der Chiffre Namen in TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList wichtig?

Meistens Ja.

TLS tut nicht angeben, wer entscheidet über die Chiffre. Herkömmlicherweise berücksichtigt der Server die Präferenzen des Kunden. Das heißt, der Server verwendet die erste Einstellung des Clients, wenn diese verfügbar und aktiviert ist, oder die zweite Einstellung des Clients, falls diese verfügbar und aktiviert ist, und so weiter.

Die meisten Bibliotheken ermöglichen es einem Server, das Verhalten zu überschreiben. Zum Beispiel mit OpenSSL, SSL_OP_CIPHER_SERVER_PREFERENCE Option. In diesem Fall stimmt der Server mit der ersten Einstellung des Servers überein, wenn der Client sie ankündigt, der zweiten Einstellung des Servers, wenn der Kunde sie ankündigt, und so weiter.

Für Server, die ich kontrolliere, stimme ich die Cipher Suite Liste und in der Regel setzen SSL_OP_CIPHER_SERVER_PREFERENCE, weil viele Kunden nicht auf die Details achten. Sie werfen einfach die Suppe der Chiffre-Suiten in den ClientHello in der Hoffnung, dass etwas klebt.


Die Reihenfolge, in der ein Server Chiffre bietet, ist wichtig, aber habe ich die Kontrolle über diesen Auftrag?

Ja.

Bestimmen Sie auf dem Server die Reihenfolge der Cipher Suites, und legen Sie sie dann mit SSL_CTX_set_cipher_list oder SSL_set_cipher_list fest. Indem Sie die Liste einstellen, stellen Sie sicher, dass RC4-MD5 nicht verwendet wird, auch wenn es die erste Wahl des Kunden ist (vorausgesetzt, Sie lassen es weg). Um die maximale Wirkung zu erzielen, setzen Sie auch SSL_OP_CIPHER_SERVER_PREFERENCE Kontextoption.

Siehe auch How do I disable a particular cipher suite in openssl? Der Kontext ist OpenSSL, aber es sollte Ihnen eine Vorstellung davon geben, wo in Delphi zu gehen ist.


(Kommentare): Was kann man von Ihrer Antwort mir nicht klar ist: Hat bereits die CipherList Eigenschaft einen Auftrag bedeuten? Wenn ich an dem zugrunde liegenden Delphi/Indy Code aussehen sehe ich, dass es nur ein Wrapper für externe Funktion ist SSL_CTX_set_cipher_list : function(_para1: PSSL_CTX; const str: PAnsiChar): TIdC_INT cdecl = nil; in IdSSLOpenSSLHeaders.pas

Wenn ich Delphi bin Verständnis richtig, dann glaube ich, die Antwort ist Ja, es tut. Aber es verwendet wahrscheinlich entweder (1) die OpenSSL-Standardliste oder (2) eine Delphi-Standardliste. Beide sind wahrscheinlich so etwas wie "ALL:!EXP:!LOW" oder ähnlich. In jedem Fall werden Sie es nach Ihrem Geschmack abstimmen wollen.

Wenn Sie interessiert sind, wie die Liste aussieht, wenn sie auf die Leitung gelegt wird, verwenden Sie Wireshark, um die ClientHello zu überprüfen. Es ist einfach, ein mit s_client zu erzeugen, und es zeigt Ihnen, was Standard Cipher Suite Liste der OpenSSL wie folgt aussieht:

$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org 

und die entsprechenden Wireshark Spur mit 55 Standard Chiffriersätze hinein gestopft:

enter image description here

Mit der Option -cipher und "HIGH:!aNULL:!MD5:!RC4" können Sie auch Ihre Sicherheit verbessern und die Anzahl der Verschlüsselungssammlungen reduzieren. Die Cipher Suite-Anzahl wird auf etwa 35 reduziert.

$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org \ 
    -cipher 'HIGH:!aNULL:!MD5:!RC4' 

Wenn Sie nicht TripleDES und Cameilla mögen, dann können Sie es auf etwa 20 Chiffriersätze mit reduzieren:

$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org \ 
    -cipher 'HIGH:!aNULL:!MD5:!RC4:!3DES:!CAMELLIA' 

Angenommen nun, ein Client mit nur konfiguriert ist RC4-MD5 und Ein Server ist nur mit AES-GCM konfiguriert. D.h., es gibt keine Überschneidung von Cipher-Suites zwischen Client und Server. In diesem Fall erhalten Sie einen Fehler in OpenSSL. Der Fehler wird 0x1408A0C1 sein, "keine geteilten Cipher Suites". Es wird auf dem Server wie folgt aussehen:

140339533272744:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1353 

Für OpenSSL-basierten Clients und Server, können Sie die Standard Cipher Suite Liste mit dem "STANDARD" Zeichenfolge bestimmen. Das ist wörtlich was es heißt (siehe ciphers(1) man page).

Es gibt 103 von ihnen, die schwache und verwundete Algorithmen enthält. In der Praxis sollten Sie es auf 16 oder so Chiffriersätze paaren unten Sie bequem mit fühlen (dh Ihre Sicherheitsposition):

$ openssl ciphers -v 'DEFAULT' | cut -f 1 -d " " | wc -l 
    103 

Und:

$ openssl ciphers -v 'DEFAULT' | cut -f 1 -d " " 
ECDHE-RSA-AES256-GCM-SHA384 
ECDHE-ECDSA-AES256-GCM-SHA384 
ECDHE-RSA-AES256-SHA384 
ECDHE-ECDSA-AES256-SHA384 
ECDHE-RSA-AES256-SHA 
ECDHE-ECDSA-AES256-SHA 
SRP-DSS-AES-256-CBC-SHA 
SRP-RSA-AES-256-CBC-SHA 
SRP-AES-256-CBC-SHA 
DH-DSS-AES256-GCM-SHA384 
DHE-DSS-AES256-GCM-SHA384 
DH-RSA-AES256-GCM-SHA384 
DHE-RSA-AES256-GCM-SHA384 
DHE-RSA-AES256-SHA256 
DHE-DSS-AES256-SHA256 
DH-RSA-AES256-SHA256 
DH-DSS-AES256-SHA256 
DHE-RSA-AES256-SHA 
DHE-DSS-AES256-SHA 
DH-RSA-AES256-SHA 
DH-DSS-AES256-SHA 
DHE-RSA-CAMELLIA256-SHA 
DHE-DSS-CAMELLIA256-SHA 
DH-RSA-CAMELLIA256-SHA 
DH-DSS-CAMELLIA256-SHA 
ECDH-RSA-AES256-GCM-SHA384 
ECDH-ECDSA-AES256-GCM-SHA384 
ECDH-RSA-AES256-SHA384 
ECDH-ECDSA-AES256-SHA384 
ECDH-RSA-AES256-SHA 
ECDH-ECDSA-AES256-SHA 
AES256-GCM-SHA384 
AES256-SHA256 
AES256-SHA 
CAMELLIA256-SHA 
PSK-AES256-CBC-SHA 
ECDHE-RSA-AES128-GCM-SHA256 
ECDHE-ECDSA-AES128-GCM-SHA256 
ECDHE-RSA-AES128-SHA256 
ECDHE-ECDSA-AES128-SHA256 
ECDHE-RSA-AES128-SHA 
ECDHE-ECDSA-AES128-SHA 
SRP-DSS-AES-128-CBC-SHA 
SRP-RSA-AES-128-CBC-SHA 
SRP-AES-128-CBC-SHA 
DH-DSS-AES128-GCM-SHA256 
DHE-DSS-AES128-GCM-SHA256 
DH-RSA-AES128-GCM-SHA256 
DHE-RSA-AES128-GCM-SHA256 
DHE-RSA-AES128-SHA256 
DHE-DSS-AES128-SHA256 
DH-RSA-AES128-SHA256 
DH-DSS-AES128-SHA256 
DHE-RSA-AES128-SHA 
DHE-DSS-AES128-SHA 
DH-RSA-AES128-SHA 
DH-DSS-AES128-SHA 
DHE-RSA-SEED-SHA 
DHE-DSS-SEED-SHA 
DH-RSA-SEED-SHA 
DH-DSS-SEED-SHA 
DHE-RSA-CAMELLIA128-SHA 
DHE-DSS-CAMELLIA128-SHA 
DH-RSA-CAMELLIA128-SHA 
DH-DSS-CAMELLIA128-SHA 
ECDH-RSA-AES128-GCM-SHA256 
ECDH-ECDSA-AES128-GCM-SHA256 
ECDH-RSA-AES128-SHA256 
ECDH-ECDSA-AES128-SHA256 
ECDH-RSA-AES128-SHA 
ECDH-ECDSA-AES128-SHA 
AES128-GCM-SHA256 
AES128-SHA256 
AES128-SHA 
SEED-SHA 
CAMELLIA128-SHA 
IDEA-CBC-SHA 
PSK-AES128-CBC-SHA 
ECDHE-RSA-RC4-SHA 
ECDHE-ECDSA-RC4-SHA 
ECDH-RSA-RC4-SHA 
ECDH-ECDSA-RC4-SHA 
RC4-SHA 
RC4-MD5 
PSK-RC4-SHA 
ECDHE-RSA-DES-CBC3-SHA 
ECDHE-ECDSA-DES-CBC3-SHA 
SRP-DSS-3DES-EDE-CBC-SHA 
SRP-RSA-3DES-EDE-CBC-SHA 
SRP-3DES-EDE-CBC-SHA 
EDH-RSA-DES-CBC3-SHA 
EDH-DSS-DES-CBC3-SHA 
DH-RSA-DES-CBC3-SHA 
DH-DSS-DES-CBC3-SHA 
ECDH-RSA-DES-CBC3-SHA 
ECDH-ECDSA-DES-CBC3-SHA 
DES-CBC3-SHA 
PSK-3DES-EDE-CBC-SHA 
EDH-RSA-DES-CBC-SHA 
EDH-DSS-DES-CBC-SHA 
DH-RSA-DES-CBC-SHA 
DH-DSS-DES-CBC-SHA 
DES-CBC-SHA 
2

Meta: keine Antwort auf die Frage, aber Antwort auf Kommentar. Um wirklich zu verstehen, ist SSL/TLS nicht wirklich programmieren und ist eine große Frage, die für SO möglicherweise zu weit gefasst ist. Aber einige Gedanken trotzdem:

  • Der Definitive Guide zu SSL/TLS als standardisiertes Protokoll, oder wirklich Familie von ihnen, sind die RFCs natürlich, die sie definieren, sowie gegebenenfalls die externen Standards von denjenigen verwiesen RFCs (wie FIPS 197 für AES, PKCS # 1 für RSA, SECG1 für ECC, usw.). Wikipedia hat eine gute Übersicht und (AFAICT) vollständige Liste der Referenzen.

  • Wenn Sie nur ein allgemeines Verständnis für wollen, was die Stücke sind und wie sie funktionieren (wie RSA vs DHE vs ECDHE und AES vs TDES oder HMAC vs AEAD) Wikipedia ist auch gut, und so ist die kanonische Q & Wie auf security.SE

  • Eine mittlere gound Ivan Ristic auf der neuen Panzer 'Buch sein könnte; Er ist der Typ hinter dem weit verbreiteten und angesehenen SSLLabs Test und das Buch ist verlinkt from that homepage. Ich habe das eigentliche Buch nicht gelesen, aber vor ein paar Jahren hat er auf seinem Blog einige der Materialien gezeigt und diskutiert, die in das Buch gehen sollen, und ich fand, dass das hervorragend aussah.

Außerdem implementieren Sie den Standard nicht direkt; Sie verwenden eine Implementierung, die eine Version von OpenSSL ist, und in der heutigen Software-Umgebung kann OpenSSL variieren. Erstens hat OpenSSL selbst eine Reihe von Build-Optionen (auch als Kompilierzeit bezeichnet). Und ich kenne Delphi nur in Umrissen, und ich weiß nicht, ob die OpenSSL-Version, die Sie identifizieren, mit oder für Delphi (oder Indy?) Oder vom Betriebssystem oder anderswo "hereingezogen" wird, und auf jeden Fall, wer es gebaut hat welche Möglichkeiten und möglicherweise sogar Modifikationen (Patches).(Zum Vergleich verwende ich häufig RedHat-basierte und Debian-basierte Linuxes, die Patches rückportieren, so dass ein Paket, das zum Beispiel als "1.0.1e" identifiziert wird, normalerweise anders ist als andere Versionen, die auch als "1.0" bezeichnet werden. 1e '.)

Verwandte Themen