2016-03-31 17 views
1

Ich versuche zu kontrollieren, welche TLS/SSL-Protokolle für HTTPS-Verbindungen zu meinem Webservice unterstützt werden, indem ich eine TIdServerIOHandlerSSLOpenSSL Komponente verwende und die Eigenschaften SSLOptions.Method und SSLOptions.SSLVersions (wie in this answer vorgeschlagen) festlegen.Wie kann ich nur TLS 1.x (in meinem Webservice) unterstützen?

Die Standardeinstellung ist Methode sslvTLSv1 und SSLVersions [sslvTLSv1] (siehe this answer für die Beziehungen zwischen Methode und SSLVersions):

enter image description here

Ich benutze nmap mit dem ssl-enum-ciphers.nse Skript von this answer zu überprüfen, was tatsächlich vorhanden ist, und Get dieses Skript Ausgabe:

| ssl-enum-ciphers: 
| TLSv1.0: 
|  ciphers: 
|  TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A 
|  compressors: 
|  NULL 
|  cipher preference: client 
|  warnings: 
|  Ciphersuite uses MD5 for message integrity 
|  Weak certificate signature: SHA1 
|_ least strength: C 

Aber TLS 1.1 und TLS 1.2 fehlen.

Wenn ich Set-Methode auf sslvSSLv23 („ein Platzhalter, die in Fällen dynamische Version Verhandlungen ermöglicht, wo Client- und Server-Unterstützung verschiedene SSL/TLS-Versionen. Es sie die höchste Version, um herauszufinden, ermöglicht und zu verwenden, die für beide Parteien“ (source)) Ich sehe sslvSSLv2 und sslvSSLv3 werden aktiv.
Aber ich möchte nicht unterstützen SSL 2.0 (veraltet/verboten im Jahr 2011 von RFC 6176) und 3.0 (veraltet im Juni 2015 von RFC 7568) (source).
Ich kann nicht beide sslvTLSv2 und sslvTLSv3 aus dem Satz von Methode sslvSSLv23 generiert generiert: Wir setzen auf die Standardkonfiguration, wo nur TLS 1.0 unterstützt wird.

Beachten Sie, dass, wenn ich 'nur' sslvTLSv2 auslassen (Methode ist sslvSSLv23 und SSLVersions ist [sslvSSLv3,sslvTLSv1]) erzählt nmap mich:

| ssl-enum-ciphers: 
| SSLv3: 
|  ciphers: 
|  TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A 
|  compressors: 
|  NULL 
|  cipher preference: client 
|  warnings: 
|  CBC-mode cipher in SSLv3 (CVE-2014-3566) 
|  Ciphersuite uses MD5 for message integrity 
|  Weak certificate signature: SHA1 
| TLSv1.0: 
|  ciphers: 
|  TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A 
|  compressors: 
|  NULL 
|  cipher preference: client 
|  warnings: 
|  Ciphersuite uses MD5 for message integrity 
|  Weak certificate signature: SHA1 
| TLSv1.1: 
|  ciphers: 
|  TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A 
|  compressors: 
|  NULL 
|  cipher preference: client 
|  warnings: 
|  Ciphersuite uses MD5 for message integrity 
|  Weak certificate signature: SHA1 
|  Weak cipher RC4 in TLSv1.1 or newer not needed for BEAST mitigation 
| TLSv1.2: 
|  ciphers: 
|  TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A 
|  TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A 
|  TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A 
|  TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C 
|  TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A 
|  TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A 
|  TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A 
|  compressors: 
|  NULL 
|  cipher preference: client 
|  warnings: 
|  Ciphersuite uses MD5 for message integrity 
|  Weak certificate signature: SHA1 
|  Weak cipher RC4 in TLSv1.1 or newer not needed for BEAST mitigation 
|_ least strength: C 

Was kann ich nur alle TLS 1.x-Versionen, so dass Sie sind unterstützt?

Dies ist Delphi XE2 mit Indy 10.5.8.0, läuft auf Win7, getestet mit OpenSSL 1.02f. Mit OpenSSL 1.02g bekomme ich this issue, wir sind noch nicht bereit für unser Update auf Delphi Seattle (Update 1) wo dies im Indy-Code gelöst ist.

Zusätzliche Hinweise:

  • Sollte ich fallen TLS 1.0-Unterstützung als auch?

  • SSLOptions.Mode ist immer noch auf der Standardeinstellung sslmUnassigned, ich möchte später darauf schauen.

  • Beachten Sie, dass das nmap-Skript nur SSLv3/TLS-Versionen und nicht SSLv2 testet. Ich benutzen SSLScan zusätzlich, und das zeigt, dass, wenn ich sslvTLSv3 nur auslassen, wird SSL2 in der Tat immer noch aktiviert ;-(

  • die Daten zu schwach Chiffren vergessen, das ist das nächste, was ;-)

  • angehen

    Ich bin tatsächlich nicht in der Lage, einen nmap Test zu machen, wenn ich meinen Webservice in der Delphi IDE starte, dies gibt alle Arten von Laufzeitfehlern (die nicht auftauchen, wenn ich die ausführbare Datei ausführe).Vielleicht sollten diese passieren, weil das nmap-Skript alle Arten von Tests abfeuert?

 
    EIdOSSLAcceptError 'Error accepting connection with SSL. EOF was observed that violates the protocol.' 
    EIdOSSLUnderlyingCryptoError in ssl3_get_client_hello:no shared cipher 
    EIdOSSLUnderlyingCryptoError in ssl3_get_client_hello:wrong version number 

Antwort

1

Aber TLS 1.1 und TLS 1.2 fehlen.

Richtig, denn wenn man die Method-sslvTLSv1, Indy gesetzt wird nur TLS 1.0 verwenden speziell.

Ihr Screenshot des Objektinspektor zeigt deutlich, dass Sie eine Version von Indy verwenden, die nicht TLS unterstützt 1.1+ (wenn du wäre, würde es sslvTLSv1_1 und sslvTLSv1_2 Optionen in der SSLVersions Eigenschaft verfügbar).

Beachten Sie, dass, wenn ich 'nur' sslvTLSv2 auslassen (Methode ist sslvSSLv23 und SSLVersions ist [sslvSSLv3, sslvTLSv1]), sagt mir nmap:

Wenn die MethodsslvSSLv23 ist, Indy lediglich deaktiviert unerwünschte SSL/TLS-Versionen, in diesem Fall SSLv2. Sie verwenden eindeutig eine Version der OpenSSL-Bibliothek, die TLS 1.1+ unterstützt. Da Ihre Indy-Version TLS 1.1+ nicht unterstützt, werden sie nicht deaktiviert. Sie sind standardmäßig aktiviert. Da TLS 1.0 nicht deaktiviert wird, wird TLS 1.1+ implizit von OpenSSL selbst aktiviert.

Was kann ich tun, damit nur alle TLS 1.x-Versionen unterstützt werden?

Dies ist ein bisschen aus einer ungeraden Problem zu umgehen, aber Sie können die SSLVersions-[sslvSSLv23,sslvTLSv1] eingestellt. Das wird die Method auf sslvSSLv23 setzen und sslvSSLv23 aus der SSLVersions entfernen. Auf diese Weise verwendet Indy den SSLv23-Platzhalter und deaktiviert SSLv2 und SSLv3, sodass TLS 1.0+ aktiviert bleibt.

Leider können Sie diese Konfiguration im Objektinspektor nicht wirklich zur Entwurfszeit vornehmen. Nun, Sie können (erst sslvTLSv1 zuerst aktivieren und danach ssvSSLv23 aktivieren), aber es wird nicht korrekt im DFM gespeichert (die SSLVersions wird weggelassen, da [sslvTLSv1] der Standardwert ist) und wird damit wieder aktivieren SSLv2 und SSLv3 zur Laufzeit. Um zu vermeiden, dass, werden Sie die SSLVersions im Code zur Laufzeit zuweisen müssen, bevor Sie Ihren Server zu aktivieren:

IdServerIOHandlerSSLOpenSSL1.SSLOptions.SSLVersions := [sslvSSLv23,sslvTLSv1]; 

Ansonsten ist die Alternative zu einer up-to-date-Version von Indy zu aktualisieren, die nativ unterstützt TLS 1.1+, dann können Sie einfach die SSLVersions auf [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2] (zur Laufzeit oder Design-Zeit) setzen und weitermachen.

+0

Danke Remy, das funktioniert. Zum Glück habe ich zur Laufzeit alles gemacht. Wir arbeiten auch daran, in naher Zukunft alles von XE2 nach Seattle zu bringen. –