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:
Bearbeiten Sie die Datei
app.yaml
und fügen Sie die auf1
gesetzte UmgebungsvariablePYTHONHTTPSVERIFY
hinzu:env_variables: PYTHONHTTPSVERIFY: 1
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.