Gunicorn: Tambahkan dukungan untuk konstanta bernama di flag --ssl-version

Dibuat pada 15 Sep 2015  ·  37Komentar  ·  Sumber: benoitc/gunicorn

Saya menggunakan gunicorn dengan ssl cert dan kunci. Ini menyediakan koneksi TLS 1.0. Apakah mungkin untuk mengonfigurasi gunicorn untuk menggunakan TLS 1.2?

Improvement Documentation help wanted FeaturSSL - Mailing List -

Semua 37 komentar

Hai @rrajaravi , apakah Anda mencoba mengatur http://docs.gunicorn.org/en/latest/settings.html#ciphers ?

menabrak

Bagaimana cara menentukannya berhasil atau tidak?

bisakah kita menutup masalah ini?

TL;DR
Gunicorn tampaknya hanya mendukung:
TLSv1
SSLv2

Dan tidak mendukung:
SSLv3
SSLv23
TLSv1_1
TLSv1_2

@berkerpeksag Dokumen di http://docs.gunicorn.org/en/latest/settings.html#ciphers tampaknya tidak benar.
Saya menemukan protokol di ssl.py. Tak satu pun dari mereka kecuali, TLSv1 dan SSLv2, berfungsi ketika disediakan pada opsi baris perintah di Ubuntu 14.04 LTS, Python 3.5.1, OpenSSL 1.0.1f 6 Jan 2014

Sisanya gagal dengan kesalahan:
[2016-03-22 08:51:49 +0000] [2924] [ERROR] Pengecualian dalam proses pekerja:
Traceback (panggilan terakhir terakhir):
File "/home/me/Envs/myproject/lib/python3.5/site-packages/gunicorn/workers/sync.py", baris 126, dalam pegangan
self.cfg.ssl_options)File "/usr/local/lib/python3.5/ssl.py", baris 1064, di wrap_socketsandi = sandi)File "/usr/local/lib/python3.5/ssl.py", baris 690, di **init
self._context.set_ciphers(sandi)
ssl.SSLError: ('Tidak ada sandi yang dapat dipilih.',)


/usr/local/lib/python3.5/ssl.py
Konstanta berikut mengidentifikasi berbagai varian protokol SSL:

PROTOCOL_SSLv2
PROTOCOL_SSLv3
PROTOCOL_SSLv23
PROTOCOL_TLSv1
PROTOCOL_TLSv1_1
PROTOCOL_TLSv1_2

Terima kasih telah melakukan triase ini, @edwardotis. Saya membuka kembali ini untuk mengklarifikasi dokumentasi.

@berkerpeksag juga apakah kita menggunakan default yang bagus?

TLSv1 terlihat bagus untuk versi Python yang lebih lama, tetapi mungkin kita dapat mengubah nilai default menjadi SSLv23 untuk menggunakan protokol terbaik yang tersedia (baik untuk klien dan server).

Juga, saya pikir kita harus mengajukan pengecualian jika SSLv2 atau SSLv3 digunakan di Gunicorn 20 (akan sangat bagus untuk menghentikannya di rilis 19.x berikutnya).

@berkerpeksag : +1:

Apakah ada yang menerapkan perubahan ini? Jika tidak, saya akan dengan senang hati mencobanya & membuka PR.. Mampu mengatur cipher ke sesuatu > TLSv1.0 penting bagi kami dan dari apa kami dapat melihat versi TLS apa pun yang lebih besar dari 1 kaleng' t disetel .. itu hanya default kembali ke 1.0 (Kami mencoba yang tercantum dalam dokumen & konstanta yang tercantum di sini tidak berhasil) -- hanya menghasilkan No cipher can be selected

@AndrewJHart itu akan sangat bagus! :) Terima kasih!

Dimungkinkan untuk menggunakan versi lain. Anda hanya perlu menentukan konstanta ke --ssl-version pada baris perintah. Konstanta ini berasal dari modul stdlib ssl .

$ python -c "import ssl; print(ssl.PROTOCOL_SSLv23)"     
  2
$ python -c "import ssl; print(ssl.PROTOCOL_TLSv1_2)"
  5

Cukup tentukan --ssl-version 2 atau --ssl-version 5 dan Anda harus memiliki dukungan sandi TLS 1.2.

@AndrewJHart lihat #1440 jika Anda ingin berkontribusi beberapa peningkatan pada SSL. Kita harus beralih menggunakan SSLContext untuk kontrol yang lebih baik atas konteks, seperti mengatur preferensi urutan sandi server. Saya akan memposting perbedaan tentang masalah itu sebentar dengan contoh mulai menerapkan ini untuk pekerja sinkronisasi. Bantuan apa pun untuk meningkatkan dukungan SSL akan sangat dihargai.

Juga, permintaan tarik sederhana untuk mengubah nilai default di gunicorn/config.py untuk menggunakan konstanta SSLv23 alih-alih TLSv1 akan bagus.

Maaf, saya bermaksud mengatakan #1140

Saya tidak mengerti mengapa masalah ini dibuka kembali. Saya telah menguji Gunicorn dengan --ssl-version 2 dan menemukan bahwa cipher TLS 1.2 berfungsi dengan baik.

Saya akan menutup, tetapi tolong buka kembali dan jelaskan jika menurut Anda saya telah melakukannya karena kesalahan.

Saya membuka #1249 untuk melacak perubahan default.

Saya membukanya kembali karena:

a) Pengguna harus dapat meneruskan 'SSLv23' atau 'TLSv1_2' alih-alih 2 , atau 5 .
b) Kita harus mendokumentasikan opsi yang tersedia alih-alih mengarahkannya ke dokumen Python. https://docs.python.org/3.5/library/ssl.html adalah salah satu dokumen terpanjang di stdlib dan pengguna tidak boleh menghabiskan terlalu banyak waktu hanya untuk melihat opsi apa yang tersedia.

Dibuka kembali, menambahkan label dokumentasi.

beri tahu saya apa yang dibutuhkan di sini, jika kami dapat menutupnya sebelum rilis 19,5 (yaitu sebelum rabu) akan keren :)

Ini masih terbuka untuk menyediakan hanya dukungan untuk konstanta bernama di
--ssl-versi bendera.

Pada Senin, 2 Mei 2016, 05:43 Benoit Chesneau [email protected] menulis:

beri tahu saya apa yang dibutuhkan di sini, jika kami dapat menutupnya sebelum rilis 19,5
(yaitu sebelum menikah) akan keren :)


Anda menerima ini karena Anda mengubah status buka/tutup.
Balas email ini secara langsung atau lihat di GitHub
https://github.com/benoitc/gunicorn/issues/1114#issuecomment -216225302

mari kita lupakan versi 3.x untuk saat ini. Apa konstanta yang perlu ditambahkan untuk mendukungnya di semua versi python?

Apakah mungkin untuk mengaktifkan atau menonaktifkan versi spesifik TLS yang berbeda? Misalnya, keinginan untuk dapat menonaktifkan atau mengaktifkan versi yang lebih lama adalah hal yang umum. Tidak jelas bagi saya dari dokumentasi jika "--ssl-version" dapat digunakan untuk menonaktifkan versi yang lebih lama atau jika dapat digunakan lebih dari sekali (misalnya menonaktifkan SSL3 dan menonaktifkan TLS1.0).

Saya pikir itu akan membutuhkan peralihan untuk menggunakan SSLContext dan menambahkan opsi baru --ssl-options (kami mungkin hanya akan menggunakan ssl.create_default_context() sehingga SSLv3 dan TLS 1.0 akan dinonaktifkan secara default) Karena ada terlalu banyak kombinasi yang menurut saya --ssl-version akan menerima konstanta bernama tetapi pengguna masih dapat memasukkannya ke dalam file konfigurasi Gunicorn:

ssl_options = ssl.OP_NO_COMPRESSION | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3

Penggunaan PROTOCOL_ * untuk menentukan protokol _dan versi yang tepat_ tampaknya semakin ditinggalkan. Dengan asumsi ssl_options saat ini tidak diimplementasikan, saya mengangkat #1680.

1890 memperbaikinya.

Mungkin seseorang mungkin memiliki beberapa petunjuk untuk saya? Saya telah berjuang dengan ini untuk sementara waktu sekarang. Berikut lingkungan saya:

Python 3.4.3
gunicorn==19.9.0
pyOpenSSL==18.0.0
cryptography==2.4.2

Saya juga menggunakan bendera gunicorn --ssl-version 5

Server saya tampaknya melayani TLS 1.2, tetapi memungkinkan banyak suite sandi yang tidak aman. Bagaimana saya bisa membatasi cipher suite? Saya mencoba flag --ciphers , tetapi tidak berhasil dengan itu.

Terima kasih!

--ssl-version 5 --ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256
bekerja dengan baik:

~# openssl s_client -koneksi localhost:443 -cipher ECDHE-RSA-AES256-GCM-SHA384
TERHUBUNG (00000003)
kedalaman = 3...

~# openssl s_client -koneksi localhost:443 -cipher DHE-RSA-AES256-GCM-SHA384
TERHUBUNG (00000003)
140497569816640: error:14094410 :SSL routines:ssl3_read_bytes :sslv3 alert handshake failure:../ssl/record/rec_layer_s3.c :1407:SSL alert number 40

Terima kasih @lemrouch. Tidak yakin mengapa itu tidak berhasil untuk saya sebelumnya. Ini bekerja untuk saya sekarang!

Bagaimana cara menggunakan TLS 1.2 alih-alih TLS1.0 untuk aplikasi labu gunicorn? Bisakah beberapa tolong bagikan perintah terminal atau kode yang harus dimasukkan?

@rkbala Seperti inilah tampilan kode yang relevan untuk aplikasi flask saya:

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

@rkbala Seperti inilah tampilan kode yang relevan untuk aplikasi flask saya:

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

@pixelrebel Terima kasih!! Saya akan mencobanya dan memberi tahu Anda.

Apa artinya ssl.options |=OP_NO_* ini?

Bisakah kita mengubah sandi? Atau set_ciphers di atas akan Mengatur cipher acak?

@rkbala Saya tidak ingat mengapa operasi bitwise-atau diperlukan. Mungkin tidak perlu ... layak untuk diuji.

Anda dapat mengubah cipher ke apa pun yang kompatibel dengan TLS 1.2. Dalam kasus saya, aplikasi saya menyediakan API untuk Slack untuk berkomunikasi dengannya. Jadi saya hanya perlu mendukung cipher yang digunakan Slackbot.

@rkbala IO harus mengklarifikasi Saya tidak ingat mengapa saya membutuhkan sintaks itu, tetapi saya percaya pada saat itu, saya perlu secara eksplisit menentukan opsi OP_NO_* untuk membuat aplikasi saya hanya menggunakan TLS1.2 dan tidak ada versi yang lebih rendah.

@rkbala Saya tidak ingat mengapa operasi bitwise-atau diperlukan. Mungkin tidak perlu ... layak untuk diuji.

Anda dapat mengubah cipher ke apa pun yang kompatibel dengan TLS 1.2. Dalam kasus saya, aplikasi saya menyediakan API untuk Slack untuk berkomunikasi dengannya. Jadi saya hanya perlu mendukung cipher yang digunakan Slackbot.

Oke terima kasih. Saya pikir gunicorn mengambil cipher python default jika kami tidak menentukannya. Koreksi saya jika saya salah.

Juga apakah kode flask di atas membuat gunicorn untuk memulai aplikasi flask hanya di TLSv1.2? Pertanyaannya adalah karena saya ingin menjalankan aplikasi flask melalui gunicorn. Saya baru mengetahui hari ini bahwa perintah terminal gunicorn “gunicorn —ssl-version TLSV1_2 project:app ” akan memulai aplikasi flask di tls v1.2. Cara mana yang lebih efisien?

Ya, itu hanya untuk TLS 1.2. Segala sesuatu yang lain sudah usang AFAIK. Saya berasumsi mereka memiliki efek yang sama, tetapi saya kira menggunakan opsi baris perintah mengesampingkan opsi dalam skrip. Saya bukan ahli dengan gunicorn dengan cara apa pun. Jadi ikuti saran saya dengan sebutir garam.

Ya, itu hanya untuk TLS 1.2. Segala sesuatu yang lain sudah usang AFAIK. Saya berasumsi mereka memiliki efek yang sama, tetapi saya kira menggunakan opsi baris perintah mengesampingkan opsi dalam skrip. Saya bukan ahli dengan gunicorn dengan cara apa pun. Jadi ikuti saran saya dengan sebutir garam.

Terima kasih @pixelrebel akan saya jelajahi di bagian itu.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

zenglingyu picture zenglingyu  ·  4Komentar

thomasjungblut picture thomasjungblut  ·  3Komentar

mrwillis picture mrwillis  ·  4Komentar

benoitc picture benoitc  ·  4Komentar

haolujun picture haolujun  ·  3Komentar