Menggunakan SSL Python

Versi 2.7 library SSL Python tidak digunakan lagi. Sebagai gantinya, gunakan versi terbaru, yang saat ini 2.7.11.

App Engine mendukung library SSL Python native untuk runtime Python 2.7 melalui library SSL yang harus Anda tambahkan ke aplikasi.

Menentukan library SSL

Jika ingin menggunakan SSL Python native, Anda harus mengaktifkannya dengan menentukan ssl untuk konfigurasi libraries di app.yaml aplikasi Anda. Anda harus menggunakan versi library terbaru, yang saat ini adalah versi 2.7.11. Versi ini mendukung TLS versi 1.0, 1.1, dan 1.2 serta sesuai dengan versi SSL dari Python 2.7.11 dan seterusnya:

libraries:
- name: ssl
  version: latest

Menyediakan sertifikat otoritas

Untuk melakukan handshake SSL, Anda harus memiliki file yang berisi sertifikat certificate authority gabungan. Anda dapat mengupload file sendiri dengan aplikasi Anda, atau menggunakan file yang disediakan oleh App Engine: /etc/ca-certificates.crt.

Melakukan handshake SSL

Metode wrap_socket Python 2.7 menggunakan dua parameter nama file yang berisi kunci dan sertifikat klien. Di lingkungan App Engine, ini merupakan batasan karena aplikasi tidak dapat menulis file untuk menyediakan kunci dan sertifikat yang berbeda secara dinamis. Untuk mengatasi pembatasan ini, parameter certfile dan keyfile untuk metode ssl.wrap_socket dapat berupa objek "seperti file" yang memungkinkan aplikasi menyimpan sertifikat dan kunci dengan cara lain selain hanya dalam file aplikasi yang diupload. (Objek "seperti file" adalah objek yang memiliki metode "baca" yang menampilkan seluruh sertifikat sebagai string.)

  # 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)

Anda tidak perlu menentukan parameter ssl_version. Jika Anda menghilangkannya, library 2.7.11 akan ditetapkan secara default ke PROTOCOL_SSLv23. Anda juga dapat menentukan PROTOCOL_TLSv1, PROTOCOL_TLSv1_1, atau PROTOCOL_TLSv1_2.

Implementasi App Engine metode wrap_socket menyertakan parameter ca_certs yang diperlukan, yang digunakan untuk menentukan file khusus yang berisi sertifikat certificate authority gabungan.

Memvalidasi sertifikat

Aplikasi Anda harus memvalidasi sertifikat untuk mencegah kerentanan keamanan tertentu, seperti serangan "man in the middle".

Untuk melakukan ini:

  1. Edit file app.yaml Anda, dengan menambahkan variabel lingkungan PYTHONHTTPSVERIFY yang ditetapkan ke 1:

     env_variables:
       PYTHONHTTPSVERIFY: 1
    
  2. Deploy ulang aplikasi Anda.

Selain menentukan validasi sertifikat di app.yaml, Anda dapat secara eksplisit memanggil library SSL untuk melakukan validasi, setelah melakukan handshake SSL yang berhasil, seperti berikut:

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

Kode di atas menggunakan fitur match_hostname, yang di-backport dari Python 3.2 untuk menjadi bagian dari modul SSL App Engine Python 2.7.11. Panggilan ini memastikan sertifikat yang diberikan oleh peer cocok dengan salah satu host yang ditetapkan dalam sertifikat peer.

Mengerjakan dev_appserver

Anda dapat menerbitkan permintaan HTTPS menggunakan urlfetch API, perilaku validasi sertifikat Dev_server menggunakan httplib menggunakan urlfetch identik dengan lingkungan App Engine produksi. Dev_appserver tidak mendukung permintaan yang menggunakan soket.