Python SSL verwenden

Die Version 2.7 der Python SSL-Bibliothek wurde verworfen. Verwenden Sie stattdessen die neueste Version, derzeit 2.7.11.

App Engine unterstützt die native Python SSL-Bibliothek für die Python 2.7-Laufzeit über die SSL-Bibliothek, die Sie Ihrer Anwendung hinzufügen müssen.

SSL-Bibliothek angeben

Wenn Sie natives Python SSL verwenden möchten, müssen Sie es aktivieren. Geben Sie dazu ssl für die libraries-Konfiguration in der app.yaml-Datei Ihrer Anwendung an. Sie sollten die neueste Version der Bibliothek verwenden, derzeit Version 2.7.11. Diese Version unterstützt TLS in den Versionen 1.0, 1.1 und 1.2 und entspricht den SSL-Versionen ab Python 2.7.11:

libraries:
- name: ssl
  version: latest

Autorisierungszertifikate bereitstellen

Sie müssen eine Datei haben, die verkettete Zertifikate der Zertifizierungsstelle enthält, um einen SSL-Handshake durchzuführen. Sie können Ihre eigene Datei zusammen mit Ihrer Anwendung hochladen oder Sie können die von App Engine bereitgestellte Datei verwenden: /etc/ca-certificates.crt.

SSL-Handshake durchführen

Die Methode wrap_socket von Python 2.7 verwendet zwei Dateinamenparameter, die den Schlüssel und das Zertifikat des Clients enthalten. In der App Engine-Umgebung ist das eine Einschränkung, da die Anwendung keine Dateien schreiben kann, um verschiedene Schlüssel und Zertifikate dynamisch bereitzustellen. Die Parameter certfile und keyfile für die Methode ssl.wrap_socket können dateiähnliche Objekte sein, die es der Anwendung ermöglichen, Zertifikate und Schlüssel auf andere Weise als nur in hochgeladenen Anwendungsdateien zu speichern, um diese Einschränkung zu umgehen. (Ein dateiähnliches Objekt hat die Methode "read", die das gesamte Zertifikat als String zurückgibt.)

  # Example of a dynamic key and cert.
  datastore_record_k = ndb.Key('Employee', 'asalieri', 'Address', 1)
  datastore_record = datastore_record_k.get()
  key_str = datastore_record.key_str
  cert_str = datastore_record.cert
  ssl_server = ssl.wrap_socket(server_sock,
                              server_side=False,
                              keyfile=StringIO.StringIO(key_str),
                              certfile=StringIO.StringIO(cert_str),
                              cert_reqs=ssl.CERT_REQUIRED,
                              ssl_version=ssl.PROTOCOL_SSLv23,
                              ca_certs=CERTIFICATE_FILE)

Sie müssen den Parameter ssl_version nicht angeben. Wenn Sie ihn weglassen, verwendet die Bibliothek 2.7.11 standardmäßig PROTOCOL_SSLv23. Sie können auch PROTOCOL_TLSv1, PROTOCOL_TLSv1_1 oder PROTOCOL_TLSv1_2 angeben.

Die App Engine-Implementierung der Methode wrap_socket enthält den erforderlichen Parameter ca_certs, mit dem die spezielle Datei angegeben wird, die verkettete Zertifikate der Zertifizierungsstelle enthält.

Zertifikate validieren

Ihre Anwendung sollte Zertifikate validieren, um bestimmte Sicherheitslücken wie Man-in-the-Middle-Angriffe zu verhindern.

So gehen Sie dazu vor:

  1. Bearbeiten Sie die Datei app.yaml und fügen Sie die auf 1 gesetzte Umgebungsvariable PYTHONHTTPSVERIFY hinzu:

     env_variables:
       PYTHONHTTPSVERIFY: 1
    
  2. Stellen Sie die Anwendung noch einmal bereit.

Alternativ zur Angabe der Zertifikatsprüfung in der Datei app.yaml können Sie die SSL-Bibliothek nach Abschluss eines erfolgreichen SSL-Handshakes explizit aufrufen, um die Validierung durchzuführen:

    ssl.match_hostname(ssl_server.getpeercert(), 'a.hostname.com')

Der obige Code verwendet die Funktion match_hostname, die von Python 3.2 rückportiert wird, um Teil des SSL-Moduls unter Python 2.7.11 von App Engine zu sein. Mit diesem Aufruf wird sichergestellt, dass das vom Peer bereitgestellte Zertifikat mit einem der designierten Hosts im Zertifikat des Peers übereinstimmt.

Mit dev_appserver arbeiten

Sie können HTTPS-Anfragen mit der urlfetch API senden. Das Verhalten der Zertifikatsprüfung von Dev_server mit httplib über "urlfetch" ist identisch mit dem in der App Engine-Produktionsumgebung. Dev_appserver unterstützt keine Anfragen mit Sockets.