La versione 2.7
della libreria SSL Python è stata
obsoleto.
Utilizza invece l'ultima versione, attualmente 2.7.11
.
App Engine supporta la libreria SSL di Python nativa per il runtime Python 2.7 tramite la libreria SSL, che devi aggiungere alla tua app.
Specifica della libreria SSL
Se vuoi utilizzare il protocollo SSL Python nativo, devi abilitarlo specificando ssl
per
della configurazione libraries
nel file app.yaml
dell'applicazione. Dovresti usare
l'ultima versione della libreria, attualmente
versione 2.7.11. Questo
supporta le versioni TLS 1.0, 1.1 e 1.2 e corrisponde allo standard SSL
versioni da Python 2.7.11 in poi:
libraries:
- name: ssl
version: latest
Fornire i certificati delle autorità
Per eseguire un handshake SSL, devi avere un file che contenga
certificati dell'autorità di certificazione concatenati. Puoi caricare il tuo file con l'applicazione oppure utilizzare il file fornito da App Engine: /etc/ca-certificates.crt
.
Esecuzione di un handshake SSL
Il metodo wrap_socket
di Python 2.7 prende due nomi file
i parametri che contengono la chiave e il certificato del client. In App Engine
dell'ambiente, questo è limitato perché l'applicazione non è in grado di scrivere file
per fornire in modo dinamico chiavi e certificati diversi. Per evitare
limitazione, i parametri certfile
e keyfile
il metodo ssl.wrap_socket
può essere "file-like" che consentono
per archiviare certificati e chiavi in altri modi
di file dell'applicazione caricati. Un oggetto "simile a un file" è un oggetto che ha un carattere "lettura"
che restituisce l'intero certificato come stringa.)
# 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)
Non è necessario specificare il parametro ssl_version
. Se lo ometti,
Il valore predefinito della libreria 2.7.11 è PROTOCOL_SSLv23
. Puoi anche specificare
PROTOCOL_TLSv1
, PROTOCOL_TLSv1_1
o PROTOCOL_TLSv1_2
.
L'implementazione App Engine del metodo wrap_socket
include
il parametro obbligatorio ca_certs
, che viene utilizzato per specificare il file speciale contenente
certificati dell'autorità di certificazione concatenati.
Convalida dei certificati
La tua app deve convalidare i certificati per evitare che vulnerabilità di sicurezza come "uomo in mezzo" attacchi informatici.
Per farlo:
Modifica il file
app.yaml
, aggiungendo la variabile di ambientePYTHONHTTPSVERIFY
impostato su1
:env_variables: PYTHONHTTPSVERIFY: 1
Esegui nuovamente il deployment dell'app.
In alternativa a specificare la convalida del certificato in app.yaml
, puoi chiamare esplicitamente la libreria SSL per eseguire la convalida dopo aver eseguito un handshake SSL riuscito, come segue:
ssl.match_hostname(ssl_server.getpeercert(), 'a.hostname.com')
Il codice riportato sopra utilizza la funzionalità match_hostname
, di cui è stato eseguito il backporting da Python 3.2 a
far parte del modulo SSL Python 2.7.11 di App Engine. Questa chiamata assicura che
fornito dal peer corrisponde a uno degli host designati in
certificato del peer.
Lavorare su dev_appserver
Puoi emettere richieste HTTPS utilizzando l'API urlfetch. Il comportamento di convalida del certificato di Dev_server che utilizza httplib
con urlfetch è identico a quello dell'ambiente App Engine di produzione. Dev_appserver
non supporta le richieste che utilizzano i socket.