Httpie: يتجاهل HTTPie شهادات النظام

تم إنشاؤها على ٩ يونيو ٢٠١٦  ·  20تعليقات  ·  مصدر: httpie/httpie

يتجاهل HTTPie شهادات النظام

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)

كمرجع ، يعمل curl بشكل جيد: curl https://example_using_my_ca.com

bug

ال 20 كومينتر

هل يعقل استخدام ssl.get_default_verify_paths () للحصول على المسارات الافتراضية؟

أود أن أقترح السلوك التالي:

إذا تم تمرير - التحقق من معلمة بخلاف لا أو نعم ، قم بتمرير المعلمة إلى الطلبات.

إذا - تم ضبط التحقق على نعم:
1) إذا تم تعيين REQUESTS_CA_BUNDLE ، فمرر True إلى طلبات التحقق.
2) متغير البيئة elif ssl.get_default_verify_paths (). يتم تعيين openssl_cafile_env ، قم بتمرير ذلك إلى طلبات التحقق
4) متغير البيئة elif ssl.get_default_verify_paths (). يتم تعيين openssl_capath_env لتمرير ذلك لطلبات التحقق
5) elif ssl.get_default_verify_paths (). capath ليس بلا ، مرر ذلك إلى طلبات التحقق
6) تمرير صحيح إلى طلبات التحقق

لكن يرجى ملاحظة أن ssl.get_default_verify_paths متاح فقط منذ python3.4

luv ليس متاحًا فقط في 3.4+ و 2.7.10+ ولكنه لا يعمل على كل منصة. هذا هو السبب في أن الطلبات تعمل على حل المشكلة الخاصة بها لحل هذه المشكلة للأشخاص. من فضلك توقف باستمرار عن التعليق على httpie. هذا مصدر قلق موجود في الطلبات وليس httpie IMO.

@ sigmavirus24 وتف الرجل؟ لا توجد فكرة عما تقصده بالتعليق باستمرار ، ولكن أيا كان ، أرى أنك لست حتى مساهمًا في httpie. أفترض مجرد ترول غبي: /

نظرة سريعة على الكود المصدري curl لترى كيف يبدو تنفيذ العمل ....

بغض النظر عن كل تلك amiga و VMS ifdefs والدعم للعديد من مكتبات ssl المختلفة ، فهو في الواقع غبي جدًا ولا يستخدم أساليب بحث openssl X509_ * (على سبيل المثال ، المستخدمة في get_default_verify_paths () في وحدة Python SSL).

بدلاً من ذلك ، يتكرر curl ببساطة على مجموعة من المواقع المعروفة في وقت الترجمة (راجع هذا m4dness https://github.com/curl/curl/blob/master/acinclude.m4#L2560) ثم يدعم صراحة التجاوز بـ (CURL_CA_BUNDLE و ) متغيرات البيئة SSL_CERT_DIR و SSL_CERT_FILE في وقت التشغيل (مرة أخرى لا تستخدم أشياء مثل X509_get_default_cert_file_env ()). هذا هو.

إذن ماذا عن تطبيق نفس النهج في نقية بيثون؟ (نعم ، يبدو الأمر سريعًا وقذرًا مثل الجحيم ولكنه يعمل مع curl!) ولكن مع إضافة دعم لنظام التشغيل windows (ssl.enum_certificates؟) و OS X (لست متأكدًا هنا ولكن يبدو أن python يستخدم مكتبة opensl المتوفرة من Apple على OS X 10.6+ لذلك يجب أن يكون ذلك جيدًا بالفعل!).

luv شكرا على التقرير ولكن من فضلك كن أكثر احتراما للأعضاء الآخرين. يعد @ sigmavirus24 مطورًا أساسيًا للطلبات التي يعتمد httpie عليها في كل HTTP والتي بدونها لن تكون موجودة حتى ، لذا فإن وجهة نظره وثيقة الصلة للغاية.

يرجى ملاحظة أن هذا لن يتم إصلاحه في الطلبات حتى الإصدار 3.0.0 ... ولن يتم دعم SSL_CERT_FILE بسبب مشكلات التوافق المحتملة https://github.com/kennethreitz/requests/pull/2903

بالمناسبة. لم أقصد أن أكون غير محترم ، لقد اعتقدت حقًا أنه كان يتصيد :) لقد خرجت عن طريقي للمساعدة في العثور على حل لمشكلة وشخص لم يساهم ولو مرة واحدة في المشروع (لقد راجعت المساهمين في HTTPie لأنني فوجئت حقًا برد فعل عدائي) كان يخبرني أن أصمت: /

luv لم

أخيرًا ، فإن مساهمات الكود ليست المساهمة الوحيدة في المشروع. إذا كنت ترغب في رؤية جميع المساهمات في مشروع ما ، فيمكنك استخدام مشروع مثل octohatrack . لقد رددت على العديد من الطلبات المتعلقة بالأخطاء على httpie لـ jkbrzt لأنهم لا يملكون الوقت الكافي لمتابعة تطوير الطلبات. عندما أرى خطأً متعلقًا بالطلبات هنا ، أستجيب لأنه يتم التعامل مع 99٪ من الوقت بالفعل. لحسن الحظ بالنسبة لـ jkbrzt ، لقد عوملت معاملة سيئة (وأسوأ بضع مرات) من قبل ، لذلك لدي جلد أكثر سمكًا.

كملاحظة جانبية ، "هم" عدد من الأحرف مثل "هو / هي" ويمكن تطبيقه بشكل عام لأنه يمكن استخدامه للإشارة إلى شخص واحد أيضًا.

فهل نصلح هذا؟

jkbrzt أود أن أسمي هذه ميزة ، وليس خطأ. من المتعمد أن تعمل الطلبات بشكل متماثل عبر Windows و * nixes و BSDs ، وفي الواقع ، تعمل العديد من توزيعات النظام للطلبات على إزالة هذا السلوك بنشاط وتشير إلى مخزن / حزمة شهادات النظام. لذلك إذا احتاج المستخدمون إلى هذا السلوك ، فيمكنهم استخدام إصدار الطلبات التي تم حزمها بواسطة موزعي النظام مع HTTPie (وربما نظام HTTPie المحزم).

أما "إصلاح هذا" ، فيعتمد على تعريفك للإصلاح. هذه ميزة _سوف تضاف إلى الطلبات. عند هذه النقطة سيحصل HTTPie على السلوك مجانًا. إذا اعتبر HTTPie أن هذا يمثل أولوية أعلى (وهو ما قد يفعله jkbrzt كما يراه مناسبًا) ،

كما يبدو أنك تستخدم linux ، luv ، يمكنك الاستفادة من حقيقة أن توزيع

نفس المشكلة مع HTTPie المثبت عبر apt (ubuntu 14.04lts)

luv هذا مفاجئ لأنني أعلم حقيقة أن الطلبات في 14.04 و 16.04 تستخدم مخزن شهادات النظام. كيف قمت بتثبيت الطلبات؟

لقد قمت بمسح جميع إصدارات "الطلبات" و "httpie" للتحقق من استخدام توزيع ubuntu لـ httpie وأنت على حق كنت لا زلت أستخدم httpie من PyPI. فشل Ubuntu httpie مع "ImportError: لا يمكن استيراد الاسم is_windows" وهي مشكلة معروفة.

أعتقد أنني نسيت تشغيل "pip3 uninstall" وقمت بتشغيل "pip uninstall" فقط حيث كان علي استخدام python3 للحصول على عمل ssl في المقام الأول.

أعتذر لـ 761 شخصًا عن "إرسال بريد عشوائي" إليهم مع وصف إعداد httpie الخاص بي.

أنا أستخدم Gentoo Linux و httpie-0.9.9 والطلبات 2.18.4 (أحدث إصدار متوفر في Gentoo) مثبتًا على مستوى النظام بواسطة مدير الحزم ، ولم يتم تثبيت إصدارات أخرى (ليس لدي حتى نقطة مثبتة). تكتشف الأدوات الأخرى (openssl s_client ، و sslclient ، و curl) شهادة CA المحلية المثبتة وتعمل بشكل جيد ، ولكن فشل httpie:

$ 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/

هل يجب علي تحديث شيء ما لجعله يعمل؟

powerman هذا سؤال أكثر ملاءمة

@ sigmavirus24 لماذا هذا؟ سؤالي هو أن هذه الطلبات / إصدارات httpie من المفترض أن تتعامل مع قائمة CA للنظام أم لا. إذا كانت الإجابة بنعم ، فمن المحتمل أن يكون هناك خطأ ما في نظامي أو أن هناك خطأ. إذا كانت الإجابة "لا" ، فما هو الإصدار الذي أحتاجه لجعله يعمل.

powerman لم يتغير شيء. لا يدعم أي منهما حزم شهادات النظام الخاصة بك ، ولكن إذا قمت بتثبيت كلاهما من مدير حزم التوزيع الخاص بك ، فمن المحتمل أنهم قاموا بتصحيح البرنامج لاستخدامهما. إذا كنت تستخدم الحزم المتوفرة في Gentoo ولا يستخدمون شهادات النظام ، فهذه مشكلة في Gentoo.

سأضيف تعليقًا إضافيًا واحدًا على هذا: أستخدم بروكسيًا مصممًا خصيصًا بحيث عند تقديم طلبات SSL ، فإنه ينشئ نفقًا آمنًا بينك وبين الوكيل ثم نفقًا آخر بين الوكيل والوجهة. يقوم بذلك حتى أتمكن من مراقبة حركة المرور التي تمر عبر الوكيل الخاص بي بأمان للتأكد من عدم محاولة أي شخص القيام بشيء سيء وإخفائه. هذا يعني للأسف أن شهادة httpie المستردة غير موثوقة (لأنها موجودة في جذر النظام ، لكن httpie لا تستخدمها).

يمكنني بالفعل إعادة إنتاج نفس المشكلة على NixOS.

بعد 4+ سنوات ...

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

jclem picture jclem  ·  6تعليقات

maciej picture maciej  ·  4تعليقات

rashthedude picture rashthedude  ·  3تعليقات

sensibleish picture sensibleish  ·  3تعليقات

hrj picture hrj  ·  5تعليقات