Bottle, Paste und SSL

Django, Flask, Bottle, WSGI, CGI…
Antworten
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

Hi, ich versuche im Moment eine kleine Bottle-Anwendung mittels Paste und SSL zum laufen zu bringen, d.h. ich will via https:// zugreifen können. Dazu verwende ich im Moment Python3.4 (unter Ubuntu)

Bottle manuel und Paste sowie SSL mittels "pip3" installiert (z.B. "sudo pip3 install paste"). Mein Testprogramm sieht wie folgt aus:

Code: Alles auswählen

#!/usr/bin/python3.4
import bottle

class SSLPasteServer(bottle.ServerAdapter):
	def run(self, handler):
		from paste import httpserver
		from paste.translogger import TransLogger
		handler = TransLogger(handler, setup_console_handler=(not self.quiet))
		self.options["ssl_pem"] = "server.pem"
		httpserver.serve(handler, host=self.host, port=str(self.port), **self.options)

@bottle.get("/x")
def get_x():
	return "Hi there"

bottle.run(server=SSLPasteServer, host="0.0.0.0", port=8081)
Ich habe dazu einen eigenen ServerAdapter implementiert und mich an die Paste-Doku bzw. "httpserver" und die Implementierung von bottle.PasteServer gehalten. Sobald ich das "ssl_perm"-Argument verwende, bricht Python mit folgendem Traceback ab:

Code: Alles auswählen

./ssl_bottle.py 
Bottle v0.12.8 server starting up (using SSLPasteServer())...
Listening on http://0.0.0.0:8081/
Hit Ctrl-C to quit.

Traceback (most recent call last):
  File "./ssl_bottle.py", line 19, in <module>
    bottle.run(server=SSLPasteServer, host="0.0.0.0", port=8081)
  File "/usr/lib/python3.4/bottle.py", line 3117, in run
    server.run(app)
  File "./ssl_bottle.py", line 12, in run
    handler, host=self.host, port=str(self.port), **self.options
  File "/usr/lib/python3/dist-packages/paste/httpserver.py", line 1291, in serve
    request_queue_size=request_queue_size)
  File "/usr/lib/python3/dist-packages/paste/httpserver.py", line 1134, in __init__
    request_queue_size=request_queue_size)
  File "/usr/lib/python3/dist-packages/paste/httpserver.py", line 1113, in __init__
    request_queue_size=request_queue_size)
  File "/usr/lib/python3/dist-packages/paste/httpserver.py", line 378, in __init__
    self.socket = TSafeConnection(ssl_context, self.socket)
  File "/usr/lib/python3/dist-packages/OpenSSL/tsafe.py", line 11, in __init__
    self._ssl_conn = apply(_ssl.Connection, args)
NameError: name 'apply' is not defined
Hat jemand eine Ahnung was ich falsch mache?

LG Glocke
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

glocke hat geschrieben:Hat jemand eine Ahnung was ich falsch mache?
Ich würde Dir eine andere Architektur empfehlen: nutze Bottle hinter Apache oder Nginx und konfiguriere diese als SSL-Endpoint.
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

kbr hat geschrieben:Ich würde Dir eine andere Architektur empfehlen
Kannst du mir vllt. auch verraten warum du mir das empfiehlst? :)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du machst so einiges falsch, die Exception weil OpenSSL nicht Python3 kompatibel ist, ist da noch das geringste Problem.

Die Wahrscheinlichkeit dass deine Webanwendung eine Sicherheitslücke hat ist relativ hoch einfach weil sie ein recht komplexer Teil des gesamten Systems ist und mit nicht vertrauenswürdigen Daten hantiert. Gleichzeitig möchtest du dass unter keine Umständen ein Angreifer an den privaten TLS Schlüssel kommt.

Zwangsläufig ist es damit unakzeptabel für die Webanwendung Zugriff auf den privaten Schlüssel zu haben. Sie muss also in einem anderen Prozess laufen, damit es nicht Zugriff auf den Schlüssel im Speicher hat und unter einem anderen User damit es die Datei mit dem Schlüssel nicht öffnen kann.

Damit alleine ist es nämlich noch nicht getan, den HTTPS ist nicht gleich HTTPS. HTTPS kann über SSL und TLS in unterschiedlichen Versionen mit unterschiedlichen Verschlüsselungsalgorithmen laufen. Nicht alle möglichen Verschlüsselungsalgorithmen sind sicher und SSL ist grundsätzlich unsicher. TLS 1.0, 1.1 und 1.2 ist sicher aber schon morgen könnte jemand feststellen dass dem doch nicht so ist. Mit diesen Details sollte und muss man sich beschäftigen, den du kannst nicht davon ausgehen dass die Standardeinstellung sicher ist, im Gegenteil wahrscheinlich ist sie es nicht.

Am einfachsten nutzt du deswegen wie von kbr Vorgeschlagen einen reverse Proxy der SSL terminiert. Informationen dazu wie man HTTPS sinnvoll konfiguriert, findet sich hier.
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

DasIch hat geschrieben:Am einfachsten nutzt du deswegen wie von kbr Vorgeschlagen einen reverse Proxy der SSL terminiert. Informationen dazu wie man HTTPS sinnvoll konfiguriert, findet sich hier.
Danke für den Hinweis!
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

kbr hat geschrieben:nutze Bottle hinter Apache oder Nginx und konfiguriere diese als SSL-Endpoint.
Inzwischen habe ich meine Bottle-Anwendung mittels uwsgi hinter Nginx konfiguriert. Demnächst geh ich die HTTP-Sache mal in Ruhe an.

LG Glocke
Antworten