Httpie: HTTPie mengabaikan sertifikat sistem

Dibuat pada 9 Jun 2016  ·  20Komentar  ·  Sumber: httpie/httpie

HTTPie mengabaikan sertifikat sistem

http --debug -j https://example_using_my_ca.com

HTTPie 0.9.3
HTTPie data: /home/lukas/.httpie
Requests 2.10.0
Pygments 1.6
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] linux

>>> requests.request(**{'allow_redirects': False,
 'auth': None,
 'cert': None,
 'data': '',
 'files': DataDict(),
 'headers': {'Accept': b'application/json',
             'Content-Type': b'application/json',
             'User-Agent': b'HTTPie/0.9.3'},
 'method': 'get',
 'params': ParamsDict(),
 'proxies': {},
 'stream': True,
 'timeout': 30,
 'url': 'https://example_using_my_ca.com',
 'verify': True})

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/requests/packages/urllib3/connectionpool.py", line 578, in urlopen
    chunked=chunked)
  File "/usr/local/lib/python3.4/dist-packages/requests/packages/urllib3/connectionpool.py", line 351, in _make_request
    self._validate_conn(conn)
  File "/usr/local/lib/python3.4/dist-packages/requests/packages/urllib3/connectionpool.py", line 814, in _validate_conn
    conn.connect()
  File "/usr/local/lib/python3.4/dist-packages/requests/packages/urllib3/connection.py", line 289, in connect
    ssl_version=resolved_ssl_version)
  File "/usr/local/lib/python3.4/dist-packages/requests/packages/urllib3/util/ssl_.py", line 308, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3.4/ssl.py", line 365, in wrap_socket
    _context=self)
  File "/usr/lib/python3.4/ssl.py", line 601, in __init__
    self.do_handshake()
  File "/usr/lib/python3.4/ssl.py", line 828, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/requests/adapters.py", line 403, in send
    timeout=timeout
  File "/usr/local/lib/python3.4/dist-packages/requests/packages/urllib3/connectionpool.py", line 604, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/http", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.4/dist-packages/httpie/core.py", line 115, in main
    response = get_response(args, config_dir=env.config.directory)
  File "/usr/local/lib/python3.4/dist-packages/httpie/client.py", line 48, in get_response
    response = requests_session.request(**kwargs)
  File "/usr/local/lib/python3.4/dist-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.4/dist-packages/requests/sessions.py", line 585, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/requests/adapters.py", line 477, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

Untuk referensi, curl berfungsi dengan baik: curl https://example_using_my_ca.com

bug

Semua 20 komentar

Apakah masuk akal untuk menggunakan ssl.get_default_verify_paths () untuk mendapatkan jalur default?

Saya akan mengusulkan perilaku berikut:

Jika --verify diberikan parameter selain no atau yes, teruskan parameter tersebut ke request.

Jika --verify disetel ke yes:
1) jika REQUESTS_CA_BUNDLE disetel, teruskan True untuk meminta verifikasi.
2) variabel lingkungan elif ssl.get_default_verify_paths (). Openssl_cafile_env disetel, berikan itu ke permintaan verifikasi
4) variabel lingkungan elif ssl.get_default_verify_paths (). Openssl_capath_env disetel untuk meminta verifikasi
5) elif ssl.get_default_verify_paths (). Capath bukan None, teruskan itu ke permintaan verifikasi
6) lain lulus Benar untuk permintaan verifikasi

tapi harap dicatat bahwa ssl.get_default_verify_paths hanya tersedia sejak python3.4

@luv tidak hanya tersedia di 3.4+ dan 2.7.10+ tetapi tidak berfungsi di setiap platform. Inilah sebabnya mengapa permintaan menangani masalahnya sendiri untuk menyelesaikan masalah ini untuk orang-orang. Tolong berhenti terus mengomentari httpie. Ini adalah masalah yang ada dalam permintaan, bukan httpie IMO.

@ sigmavirus24 wt man? Tidak tahu apa yang Anda maksud dengan terus-menerus berkomentar, tetapi apa pun, saya melihat Anda bahkan bukan kontributor httpie. Saya berasumsi hanya troll bodoh: /

sekilas ke kode sumber curl untuk melihat seperti apa implementasi yang berfungsi ....

Mengabaikan semua ifdefs amiga dan VMS dan dukungan untuk banyak pustaka ssl yang berbeda, sebenarnya cukup bodoh dan tidak menggunakan metode pencarian openssl X509_ * (seperti, misalnya, digunakan dalam get_default_verify_paths () dalam modul SSL Python).

Sebagai gantinya, curl hanya melakukan iterasi pada sekelompok lokasi yang diketahui pada waktu kompilasi (lihat m4dness ini https://github.com/curl/curl/blob/master/acinclude.m4#L2560) dan kemudian secara eksplisit mendukung penggantian dengan (CURL_CA_BUNDLE dan ) Variabel lingkungan SSL_CERT_DIR dan SSL_CERT_FILE saat runtime (sekali lagi tidak menggunakan hal-hal seperti X509_get_default_cert_file_env ()). Itu dia.

Jadi bagaimana dengan menerapkan pendekatan yang sama dengan python murni? (Ya, ini terlihat cepat dan kotor sekali tetapi berfungsi untuk curl!) Tetapi menambahkan dukungan untuk windows (ssl.enum_certificates?) Dan OS X (tidak yakin di sini tetapi python tampaknya menggunakan perpustakaan openssl yang disediakan apel di OS X 10.6+ jadi itu seharusnya sudah baik-baik saja!).

@luv terima kasih atas laporannya tapi harap lebih menghormati anggota lain. @ sigmavirus24 adalah pengembang inti dari permintaan yang bergantung pada httpie untuk semua HTTP dan tanpanya tidak akan ada, jadi pandangannya sangat relevan.

harap dicatat ini tidak akan diperbaiki dalam permintaan hingga rilis 3.0.0 ... bahkan SSL_CERT_FILE tidak akan didukung karena kemungkinan masalah kompatibilitas https://github.com/kennethreitz/requests/pull/2903

btw. Saya tidak bermaksud untuk tidak sopan. Saya benar-benar mengira dia sedang mengerjai :) Saya berusaha keras untuk membantu menemukan perbaikan untuk suatu masalah dan seseorang yang bahkan belum pernah berkontribusi pada proyek (saya memeriksa kontributor HTTPie karena saya benar-benar terkejut dengan reaksi bermusuhan seperti itu) pada dasarnya menyuruh saya untuk tutup mulut: /

@luv Aku tidak menyuruhmu diam. Ada 763 orang yang berlangganan edisi ini. 100% dari mereka _might_ menerima email untuk itu (tapi mungkin lebih seperti 70% atau ~ 534). Itu berarti Anda membuat (dalam 2 jam setelah masalah dibuka) ~ 1602 email (mungkin lebih atau kurang). Dengan kata lain, Anda mengirim spam kepada orang-orang dengan aliran kiriman sadar seperti ini. Cara terbaik untuk mendokumentasikan informasi baru ketika tidak ada yang membalas Anda adalah dengan mengedit kiriman asli.

Akhirnya kontribusi kode bukan satu-satunya kontribusi untuk sebuah proyek. Jika Anda ingin melihat semua kontribusi pada sebuah proyek, Anda mungkin menggunakan proyek seperti octohatrack . Saya telah menanggapi beberapa permintaan bug terkait di httpie untuk @jkbrzt karena mereka tidak punya cukup waktu untuk mengikuti pengembangan permintaan. Ketika saya melihat bug terkait permintaan di sini, saya merespons karena 99% dari waktu, itu sudah ditangani. Beruntung bagi @jkbrzt , saya telah diperlakukan dengan buruk (dan beberapa kali lebih buruk) sebelumnya sehingga saya memiliki kulit yang lebih tebal.

Sebagai catatan tambahan, "mereka" adalah karakter sebanyak "s / he" dan jauh lebih umum berlaku karena dapat digunakan untuk merujuk pada satu orang juga.

jadi apakah kita akan memperbaikinya?

@jkbrzt Saya akan menyebutnya fitur, bukan bug. Ini disengaja agar Permintaan bekerja secara identik di seluruh Windows, * nix, dan BSD dan pada kenyataannya, banyak distribusi sistem Permintaan secara aktif menghapus perilaku itu dan mengarah ke penyimpanan / bundel sertifikat sistem. Jadi, jika pengguna memerlukan perilaku ini, mereka dapat menggunakan versi Permintaan yang dikemas oleh distributor sistem mereka dengan HTTPie (dan mungkin HTTPie yang dipaketkan sistem).

Adapun "mendapatkan ini diperbaiki", itu tergantung pada definisi Anda tentang tetap. Ini adalah fitur yang _akan_ ditambahkan ke Permintaan. Pada titik mana HTTPie akan mendapatkan perilaku tersebut secara gratis. Jika HTTPie malah menganggap ini sebagai prioritas yang lebih tinggi (yang dapat dilakukan @jkbrzt sesuai keinginan mereka) mereka dapat menduplikasi upaya pengembangan untuk membuat rilis yang melakukannya lebih cepat.

Karena tampaknya Anda menggunakan linux, @luv , Anda dapat memanfaatkan fakta bahwa distribusi linux Anda hampir pasti memiliki versi Permintaan yang menggunakan penyimpanan sertifikat sistem saat ini. Permintaan dikemas dalam setiap distribusi linux yang telah saya periksa dan hampir semua distribusi tersebut menggunakan penyimpanan sertifikat sistem mereka. Jika bukan itu masalahnya, mungkin Anda harus melaporkan bug dengan pemelihara paket Requests dari distribusi itu.

masalah yang sama dengan HTTPie diinstal melalui apt (ubuntu 14.04lts)

@luv itu mengejutkan karena saya tahu pasti bahwa permintaan pada 14.04 dan 16.04 menggunakan penyimpanan sertifikat sistem. Bagaimana Anda menginstal Permintaan?

Saya menghapus semua versi "request" dan "httpie" untuk memverifikasi distribusi ubuntu httpie digunakan dan Anda benar. Saya masih menggunakan httpie dari PyPI. Ubuntu httpie gagal dengan "ImportError: tidak dapat mengimpor nama is_windows" yang merupakan masalah umum.

Saya rasa saya lupa menjalankan "pip3 uninstall" dan hanya menjalankan "pip uninstall" karena saya harus menggunakan python3 untuk mendapatkan ssl yang berfungsi di tempat pertama.

Saya minta maaf kepada 761 orang untuk "mengirim spam" kepada mereka dengan penjelasan tentang penyiapan httpie saya.

Saya menggunakan Gentoo Linux, httpie-0.9.9 dan request-2.18.4 (terbaru tersedia di Gentoo) yang diinstal di seluruh sistem oleh manajer paket, tidak ada versi lain yang diinstal (saya bahkan tidak menginstal pip). Alat lain (openssl s_client, sslclient, curl) mendeteksi sertifikat CA lokal yang diinstal dan berfungsi dengan baik, tetapi httpie gagal:

$ openssl s_client -quiet -connect localhost:8082                                              
depth=1 CN = Local CA home.lan
verify return:1
depth=0 CN = localhost
verify return:1
^C
$ http -v https://localhost:8082/                                                              

http: error: SSLError: HTTPSConnectionPool(host='localhost', port=8082): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",),)) while doing GET request to URL: https://localhost:8082/

Apakah saya harus memperbarui sesuatu agar berfungsi?

@powerman Itu pertanyaan yang lebih tepat untuk para redistribusi gentoo dari paket-paket itu.

@ sigmavirus24 Mengapa demikian? Pertanyaan saya adalah permintaan / versi httpie ini seharusnya menangani daftar CA sistem atau tidak. Jika ya, mungkin ada sesuatu yang salah konfigurasi di sistem saya atau ada bug. Jika tidak, versi mana yang saya perlukan untuk membuatnya berfungsi.

@powerman tidak ada yang berubah. Tidak ada yang mendukung bundel sertifikat sistem Anda, tetapi jika Anda telah menginstal keduanya dari manajer paket distribusi Anda, kemungkinan besar mereka telah menambal perangkat lunak untuk menggunakannya. Jika Anda menggunakan paket-paket yang tersedia di Gentoo dan mereka tidak menggunakan sertifikat sistem, maka itu masalah Gentoo.

Hanya akan menambahkan satu komentar tambahan tentang ini: Saya menggunakan proxy yang dirancang khusus sehingga ketika Anda membuat permintaan SSL, itu membuat terowongan aman antara Anda dan proxy dan kemudian satu lagi antara proxy dan tujuan. Ini dilakukan agar saya dapat memantau lalu lintas dengan aman melalui proxy saya untuk memastikan tidak ada yang mencoba melakukan sesuatu yang jahat dan menyembunyikannya. Sayangnya, ini berarti bahwa sertifikat yang diperoleh httpie kembali tidak dipercaya (karena ada di root sistem, tetapi httpie tidak menggunakannya).

Saya sebenarnya dapat mereproduksi masalah yang sama di NixOS.

4+ tahun kemudian ...

Apakah halaman ini membantu?
0 / 5 - 0 peringkat