Gunicorn: Unterstützung für benannte Konstanten im Flag --ssl-version hinzugefügt

Erstellt am 15. Sept. 2015  ·  37Kommentare  ·  Quelle: benoitc/gunicorn

Ich verwende Gunicorn mit SSL-Zertifikat und Schlüssel. Es bietet TLS-Verbindung 1.0. Ist es möglich, gunicorn für die Verwendung von TLS 1.2 zu konfigurieren?

Improvement Documentation help wanted FeaturSSL - Mailing List -

Alle 37 Kommentare

Hallo @rrajaravi , hast du versucht, http://docs.gunicorn.org/en/latest/settings.html#ciphers einzustellen ?

stoßen

Wie kann man feststellen, dass es funktioniert oder nicht?

können wir dieses Thema schließen?

TL;DR
Gunicorn scheint nur zu unterstützen:
TLSv1
SSLv2

Und unterstützt nicht:
SSLv3
SSLv23
TLSv1_1
TLSv1_2

@berkerpeksag Die Dokumente unter http://docs.gunicorn.org/en/latest/settings.html#Ciphers scheinen nicht korrekt zu sein.
Ich habe die Protokolle in ssl.py gefunden. Keine von ihnen außer TLSv1 und SSLv2 funktioniert, wenn sie in einer Befehlszeilenoption unter Ubuntu 14.04 LTS, Python 3.5.1, OpenSSL 1.0.1f 6. Januar 2014 bereitgestellt wird

Der Rest schlägt mit Fehler fehl:
[2016-03-22 08:51:49 +0000] [2924] [ERROR] Ausnahme im Worker-Prozess:
Traceback (letzter Anruf zuletzt):
Datei "/home/me/Envs/myproject/lib/python3.5/site-packages/gunicorn/workers/sync.py", Zeile 126, im Handle
self.cfg.ssl_options)Datei "/usr/local/lib/python3.5/ssl.py", Zeile 1064, in wrap_socketChiffren = Chiffren)Datei "/usr/local/lib/python3.5/ssl.py", Zeile 690, in **init
self._context.set_ciphers(Chiffren)
ssl.SSLError: ('Keine Chiffre kann ausgewählt werden.',)


/usr/local/lib/python3.5/ssl.py
Die folgenden Konstanten identifizieren verschiedene SSL-Protokollvarianten:

PROTOCOL_SSLv2
PROTOCOL_SSLv3
PROTOCOL_SSLv23
PROTOCOL_TLSv1
PROTOCOL_TLSv1_1
PROTOCOL_TLSv1_2

Danke für die Suche, @edwardotis. Ich öffne dies erneut, um die Dokumentation zu verdeutlichen.

@berkerpeksag verwenden wir auch den guten Standard?

TLSv1 sieht für ältere Python-Versionen gut aus, aber vielleicht können wir den Standardwert auf SSLv23 ändern, um das beste verfügbare Protokoll zu verwenden (sowohl für Clients als auch für Server).

Außerdem denke ich, dass wir eine Ausnahme auslösen sollten, wenn SSLv2 oder SSLv3 in Gunicorn 20 verwendet wird (es wäre großartig, sie in der nächsten 19.x-Version einzustellen).

@berkerpeksag : +1:

Hat jemand diese Änderungen umgesetzt? Wenn nicht, würde ich es gerne versuchen und eine PR öffnen.. Die Verschlüsselung auf etwas > TLSv1.0 setzen zu können, ist für uns wichtig und von dem, was wir sehen können, kann jede Version von TLS größer als 1 sein. nicht gesetzt werden.. es wird einfach auf 1.0 zurückgesetzt (Wir haben die in den Dokumenten aufgelisteten und die hier aufgeführten Konstanten ohne Erfolg ausprobiert) - gibt nur No cipher can be selected

@AndrewJHart das wäre toll! :) Vielen Dank!

Es ist möglich, andere Versionen zu verwenden. Sie müssen nur eine Konstante für --ssl-version in der Befehlszeile angeben. Diese Konstanten stammen aus dem stdlib-Modul ssl .

$ python -c "import ssl; print(ssl.PROTOCOL_SSLv23)"     
  2
$ python -c "import ssl; print(ssl.PROTOCOL_TLSv1_2)"
  5

Geben Sie einfach --ssl-version 2 oder --ssl-version 5 und Sie sollten TLS 1.2-Verschlüsselung unterstützen.

@AndrewJHart werfen Sie einen Blick auf #1440, wenn Sie einige Verbesserungen an SSL beitragen möchten. Wir sollten zur Verwendung von SSLContext wechseln, um den Kontext besser kontrollieren zu können, z. B. die Einstellung der Server-Verschlüsselungsreihenfolge. Ich werde in Kürze einen Unterschied zu diesem Problem mit einem Beispiel für den Beginn der Implementierung für den Synchronisierungsworker veröffentlichen. Jede Hilfe bei der Verbesserung der SSL-Unterstützung wäre sehr dankbar.

Außerdem wäre eine einfache Pull-Anfrage zum Ändern des Standardwerts in gunicorn/config.py so, dass die SSLv23-Konstante anstelle von TLSv1 verwendet wird.

Entschuldigung, ich wollte #1140 sagen

Ich verstehe nicht, warum dieses Thema erneut geöffnet wurde. Ich habe Gunicorn mit --ssl-version 2 getestet und festgestellt, dass TLS 1.2-Chiffren gut funktionieren.

Ich werde schließen, aber bitte öffnen Sie es erneut und erklären Sie, wenn Sie der Meinung sind, dass ich dies irrtümlich getan habe.

Ich habe #1249 geöffnet, um die Änderung der Standardeinstellung zu verfolgen.

Ich habe es wieder geöffnet, weil:

a) Benutzer sollten 'SSLv23' oder 'TLSv1_2' anstelle von 2 oder 5 .
b) Wir sollten die verfügbaren Optionen dokumentieren, anstatt sie in Python-Dokumente umzuleiten. https://docs.python.org/3.5/library/ssl.html ist eines der längsten Dokumente in der stdlib und Benutzer sollten nicht zu viel Zeit damit verbringen, nur zu sehen, welche Optionen verfügbar sind.

Wieder geöffnet und die Dokumentationsetiketten hinzugefügt.

lassen Sie mich wissen, was hier benötigt wird, wenn wir es vor einem 19.5-Release (dh vor der Hochzeit) schließen können, wäre es cool :)

Dies ist noch offen, um nur benannte Konstanten im zu unterstützen
--ssl-Version-Flag.

Am Montag, 2. Mai 2016, 05:43 Uhr schrieb Benoit Chesneau [email protected] :

Lassen Sie mich wissen, was hier benötigt wird, wenn wir es vor einem 19.5-Release schließen können
(also vor dem mi) wäre cool :)


Sie erhalten dies, weil Sie den Status Öffnen/Schließen geändert haben.
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/benoitc/gunicorn/issues/1114#issuecomment -216225302

Vergessen wir vorerst die 3.x-Version. Welche Konstanten müssen hinzugefügt werden, um sie in allen Python-Versionen zu unterstützen?

Hier ist ein Proof-of-Concept: https://github.com/benoitc/gunicorn/pull/1454

Ist es möglich, bestimmte unterschiedliche Versionen von TLS zu aktivieren oder zu deaktivieren? Es ist beispielsweise üblich, ältere Versionen deaktivieren oder aktivieren zu können. Aus der Dokumentation ist mir nicht klar, ob mit "--ssl-version" ältere Versionen deaktiviert oder mehrfach verwendet werden können (zB SSL3 deaktivieren und TLS1.0 deaktivieren).

Ich denke, das würde erfordern, auf SSLContext umzuschalten und eine neue Option --ssl-options hinzuzufügen (wir werden wahrscheinlich nur ssl.create_default_context() damit SSLv3 und TLS 1.0 standardmäßig deaktiviert sind). sind zu viele Kombinationen Ich glaube nicht, dass --ssl-version benannte Konstanten akzeptieren würde, aber Benutzer können sie immer noch in eine Gunicorn-Konfigurationsdatei einfügen:

ssl_options = ssl.OP_NO_COMPRESSION | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3

Die Verwendung von PROTOCOL_ * um sowohl das Protokoll _als auch die genaue Version_ anzugeben, scheint zunehmend veraltet zu sein. Unter der Annahme, dass ssl_options derzeit nicht implementiert ist, habe ich #1680 erhöht.

1890 reparierte es.

Vielleicht hat jemand eine Anleitung für mich? Damit kämpfe ich schon seit einiger Zeit. Hier ist meine Umgebung:

Python 3.4.3
gunicorn==19.9.0
pyOpenSSL==18.0.0
cryptography==2.4.2

Ich verwende auch die Gunicorn-Flagge --ssl-version 5

Mein Server scheint TLS 1.2 bereitzustellen, aber er lässt eine Menge unsicherer Verschlüsselungssammlungen zu. Wie kann ich die Verschlüsselungssammlungen einschränken? Ich habe es mit der --ciphers Flagge versucht, hatte aber kein Glück damit.

Vielen Dank!

--ssl-version 5 --ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256
funktioniert prima:

~# openssl s_client -connect localhost:443 -chiffre ECDHE-RSA-AES256-GCM-SHA384
VERBUNDEN(000000003)
Tiefe=3...

~# openssl s_client -connect localhost:443 -chiffre DHE-RSA-AES256-GCM-SHA384
VERBUNDEN(00000003)
140497569816640: error:14094410 :SSL- Routinen:ssl3_read_bytes :sslv3-Warnungs-Handshake- Fehler:../ssl/record/rec_layer_s3.c :1407:SSL-Warnungsnummer 40

Danke @lemrouch. Keine Ahnung warum das bei mir vorher nicht funktioniert hat. Bei mir funktioniert es jetzt!

Wie verwende ich TLS 1.2 anstelle von TLS1.0 für die Anwendung von Gunicorn-Flaschen? Könnten einige bitte den Terminalbefehl oder den Code teilen, der eingegeben werden muss?

@rkbala So sieht der relevante Code für meine Flaschen-App aus:

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

@rkbala So sieht der relevante Code für meine Flaschen-App aus:

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

@pixelrebel Danke!! Ich werde es versuchen und dich wissen lassen.

Was bedeutet diese ssl.options |=OP_NO_*?

Können wir die Chiffre ändern? Oder setzen die obigen set_ciphers eine zufällige Chiffre?

@rkbala Ich kann mich nicht erinnern, warum die bitweise oder Operation benötigt wurde. Es ist möglicherweise nicht notwendig ... einen Test wert.

Sie können die Verschlüsselung so ändern, dass sie mit TLS 1.2 kompatibel ist. In meinem Fall bietet meine App eine API für Slack, um mit ihr zu kommunizieren. Ich musste also nur die Verschlüsselung unterstützen, die Slackbot verwendet.

@rkbala IO sollte klarstellen, dass ich mich nicht erinnern kann, warum ich diese Syntax brauchte, aber ich glaube, dass ich damals die OP_NO_*-Optionen explizit angeben musste, damit meine App nur TLS1.2 und keine niedrigeren Versionen verwendet.

@rkbala Ich kann mich nicht erinnern, warum die bitweise oder Operation benötigt wurde. Es ist möglicherweise nicht notwendig ... einen Test wert.

Sie können die Verschlüsselung so ändern, dass sie mit TLS 1.2 kompatibel ist. In meinem Fall bietet meine App eine API für Slack, um mit ihr zu kommunizieren. Ich musste also nur die Verschlüsselung unterstützen, die Slackbot verwendet.

OK danke. Ich denke, Gunicorn verwendet die Standard-Python-Chiffre, wenn wir keine angeben. Korrigiere mich, wenn ich falsch liege.

Veranlasst der obige Flaschencode Gunicorn auch, die Flaschen-App nur in TLSv1.2 zu starten? Die Frage ist, weil ich die Flask-App über gunicorn ausführen möchte. Ich habe heute gerade erfahren, dass der Gunicorn-Terminalbefehl „gunicorn —ssl-version TLSV1_2 project:app “ die Flask-App in tls v1.2 starten wird. Welcher Weg ist effizienter?

Ja, das tut nur TLS 1.2. Alles andere ist veraltet AFAIK. Ich gehe davon aus, dass sie den gleichen Effekt haben, aber ich würde vermuten, dass die Verwendung von Befehlszeilenoptionen die Optionen im Skript überschreibt. Ich bin kein Experte für Gunicorn. Also nehmen Sie meinen Rat mit Vorsicht an.

Ja, das tut nur TLS 1.2. Alles andere ist veraltet AFAIK. Ich gehe davon aus, dass sie den gleichen Effekt haben, aber ich würde vermuten, dass die Verwendung von Befehlszeilenoptionen die Optionen im Skript überschreibt. Ich bin kein Experte für Gunicorn. Also nehmen Sie meinen Rat mit Vorsicht an.

Danke @pixelrebel Ich werde diesen Teil untersuchen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen