Requests: خطأ SSLE "تأكيد اتصال غير صالح: خطأ ([('إجراءات SSL'، 'tls_process_server_certificate'، 'فشل التحقق من الشهادة')]،) مع شهادة موقعة ذاتيًا

تم إنشاؤها على ١٠ نوفمبر ٢٠١٧  ·  12تعليقات  ·  مصدر: psf/requests

أهلا. أحاول الاتصال بخادم باستخدام https. لديّ الشهادة وهي شهادة موقعة ذاتيًا يتم تضمينها في معلمة التحقق ولكن النتيجة هي خطأ "فشل التحقق من الشهادة". كنت أشك في أن الأمر يتعلق بالشهادة الموقعة ذاتيًا (بواسطة Microsoft IIS) ولكن مع curl هذا يعمل.
شكرا مقدما!

هذا هو إخراج openssl:

openssl s_client -showcerts -connect server:44300
CONNECTED(00000003)
depth=0 CN = server
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = server
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=server
   i:/CN=server
-----BEGIN CERTIFICATE-----
<certificate data here>
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=server
issuer=/CN=server
---
No client certificate CA names sent
Peer signing digest: SHA1
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1477 bytes and written 431 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: CC4A000083B1E03B446416C9C0B16CBEAB79949E3CF5C936A309A6F92FA01364
    Session-ID-ctx:
    Master-Key: 798A570B0EC2A0CBB7C4C4DE6167E7579A92239942D869CD794B8BEBEA6EB5E492394634AD32665A8BB829DE1F3858D2
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1510329948
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

نتيجة متوقعة

أتوقع ، نظرًا لوجود الشهادة في معلمة التحقق ، لن يفشل الاتصال. إذا حاولت نفس الشيء مع curl خارج python ، فإنه يعمل:

curl https://server:44300 --cacert /usr/share/ca-certificates/server.crt
 HTTP/1.1 403 Forbidden
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 1158
Content-Type: text/html
Server: Microsoft-IIS/10.0
X-Frame-Options: SAMEORIGIN
P3P: CP=None
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Headers: X-Requested-With,Content-Type
Access-Control-Allow-Credentials: true
Date: Fri, 10 Nov 2017 16:02:26 GMT

(فشل ولكن ليس بسبب مشاكل الشهادة)

نتيجة فعلية

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/adapters.py", line 506, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='nlybstqvp4nb75n.code1.emi.philips.com', port=44300): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

خطوات التكاثر

import requests
requests.get('https://server:44300', verify='/usr/share/ca-certificates/server.crt')

معلومات النظام

$ python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": "2.1.3"
  },
  "idna": {
    "version": "2.6"
  },
  "implementation": {
    "name": "CPython",
    "version": "2.7.12"
  },
  "platform": {
    "release": "4.10.0-38-generic",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "1010007f",
    "version": "17.3.0"
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "1000207f"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": true
}

هذا الأمر متاح فقط للطلبات v2.16.4 والإصدارات الأحدث. غير ذلك،
الرجاء تقديم بعض المعلومات الأساسية حول نظامك (إصدار Python ،
نظام التشغيل ، وج).

التعليق الأكثر فائدة

إذا كنت مبتدئًا في استخدام وحدة python requests وترغب في القيام ببعض الأشياء التي تتطلب الوصول إلى مواقع آمنة ، فهناك احتمال كبير بأن يُحكم عليك هذا الخطأ - Certificate verify failed ومثل جميع المبرمجين المبتدئين. سيتم إغراء استخدام auth = session.post( mysecureurl, verify=false)

لكن هذه ممارسة سيئة للغاية وقد تم تثبيطها بسبب الكثير من منشورات SO ، ولكن لا يزال المبتدئين يسيئون استخدام هذا لأن الخطأ صعب الإصلاح.
اسمحوا لي أن ألقي بعض الضوء على هذه المسألة.
يستخدم Python (pip) و Conda وأيًا كان البرنامج المستند إلى Python مخزن شهادات منفصل تمامًا مثل جميع المتصفحات. تستخدم مكتبة طلبات Python ملف CA الخاص بها افتراضيًا ، أو ستستخدم حزمة شهادات حزمة الشهادات إذا تم تثبيتها. أيضًا ، لا تستخدم النقطة شهادات النظام بخلاف curl do.
ومن ثم بالنسبة لـ requests ، عليك تحديد مخزن الشهادات يدويًا من خلال conda أو pip.

TLDR

  1. قم بتصدير كل سلسلة الشهادات المشفرة .cer باستخدام المتصفح وفقًا لهذه المدونة الرائعة المعروضة هنا. لاحظ أن هذه المدونة لا تتعلق بـ conda certstore ولكن git certstore وهي تقول فقط لتصدير الجذر ، ومع ذلك فقد قمت بتصدير جميع سلاسل الشهادات إلى ملفات منفصلة .
  2. بعد ذلك ، قم بتثبيت certifi باستخدام الأمر pip install certifi
  3. تحقق من المسار الافتراضي لمتجر الشهادة الخاص بـ conda أو python:

import ssl
ssl.get_default_verify_paths() أو
import certifi
certifi.where()

  1. بمجرد تحديد موقع الملف الافتراضي cacert.pem ، افتح هذا (ويفضل أن يكون في Notepad ++) وألحق كل الشهادة في نهاية الملف. (اعتن بترسيم الشهادة -----BEGIN CERTIFICATE----- و -----END CERTIFICATE----- ). احفظ الملف وهذا كل شيء.
    أو إذا كنت تستخدم conda ، فاستخدم أوامر conda:
    conda config --set ssl_verify <pathToYourFile>.crt
    (لقد لاحظت أن هذا الأمر يقوم بتحديث الأشياء في C:\Users\johndoe\.condarc )

  2. استخدم الكود أدناه للتحقق:
    import certifi
    auth = session.post('https://mysecuresite.com/', cert=());

أيضًا ، إذا كنت تستخدم نظام Linux ، فيمكنك تصدير cacert المخصص إلى ملف تعريف المستخدم على مستوى النظام ( .bashrc أو .bash_profile ) باستخدام هذا الرابط .

ال 12 كومينتر

راجع للشغل ، هذا هو Ubuntu 16.04

يكاد يكون من المؤكد أن هذا الخطأ لأن الشهادة نفسها غير صالحة بطريقة ما. هل يمكنك تقديم الشهادة المشفرة PEM نفسها ، من فضلك؟

أهلا. شكرا على الاجابة السريعة. هذه هي الشهادة:
----- شهادة البداية -----
MIID3TCCAsWgAwIBAgIIU / nMdlbWojMwDQYJKoZIhvcNAQELBQAwMDEuMCwGA1UE
AwwlTkxZQlNUVZQNE5CNzVOLmNvZGUxLmVtaS5waGlsaXBzLmNvbTAeFw0xNzEx
MTAwMDAwMDBaFw0yNzExMTAwMDAwMDBaMDAxLjAsBgNVBAMMJU5MWUJTVFFWUDRO
Qjc1Ti5jb2RlMS5lbWkucGhpbGlwcy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQC3mzWep6k1 / FbkzzoyZ8QBy / tE8adfwKvw80zaLL + car1bBZ9U
VIXs4es3babtjD3QJWP5 / mwoBdIp8gvQkjA1X7RBNJZXbPz6hGR4eqaeRQLrFV9Y
TtB92MA9CDpCXfalCvzzO1jw3zvP1BHUdnTQEwSnnwtf / ريود + e7TDxGq8LThmc
glZgO8d2zaYpIjwWx92bXDF / qlqWBkH5mtKIkWOw6Y71xz0Di62cFrMAPEGBjK3c
szpBa5Ttb9 + SFtl16t2xDyCbiPFkoMW / 4u3Husy / i18hLhEuQwZMHnWsocm + etZ4
8fDt5Bqhab8zC + LKS + Ll7qZdqMHzobeB6j5JAgMBAAGjgfowgfcwXwYDVR0jBFgw
VoAUGdJ3os9nPtTubuwcy1ugtDMdSMChNKQyMDAxLjAsBgNVBAMMJU5MWUJTVFFW
UDROQjc1Ti5jb2RlMS5lbWkucGhpbGlwcy5jb22CCFP5zHZW1qIzMB0GA1UdDgQW
BBQZ0neiz2c + 1O5u7BzLW6C0Mx1IwDAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIE
sDAdBgNVHSUEFJAUBggrBgEFBQcDAQYIKwYBBQUHAwIwOwYDVR0RBDQwMoIlTkxZ
QlNUUVZQNE5CNzVOLmNvZGUxLmVtaS5waGlsaXBzLmNvbYIJbG9jYWxob3N0MA0G
CSqGSIb3DQEBCwUAA4IBAQC0MtflowNB4LTLKD1MW3w0QIY5ale3 / sEhNCQgHGN5
iNZJptFuFt5jgPGmFjy0Pb5vLMS / Ag1RF3UgTeZzFnaSgyB4mTnwj1gLdwQidVcr
2SlL7TffCj0m / bYjtNbwExRqXE4pQKb5RKwYwpruZaX / G3oHWOG9 + 2X9Pw5C42zB
OFE4KvYUwOV + noabXvil8LERIdKYxR / 2B6qBiwm47IcioqM07zTYLHJ + WDTEMO2k
Qy51yXwFmeOEr5MIBElYCQ0j2AfI4RCXr + 2cyUym7tjEr3 / I8EsZ5Crvdf ++ Gwaz
2A05ScPMr + 5yfVXygZCenMTwNAyUY1yN9zVj8 / n94Psa
----- نهاية الشهادة -----
أنا أعلم أنه ليس صحيحًا تمامًا. ولكن بطريقة أو بأخرى حليقة قادرة على قبول ذلك. كنت أتساءل لماذا الطلبات لا تفعل الشيء نفسه. افترضت أن كلاهما يستخدم openssl للتحقق من صحة الشهادة.

أي تحديثات على هذا؟ أواجه أيضًا مشكلة في المواقع المعتمدة للتوقيع الذاتي في مكتبة طلبات بيثون.

الحصول على الخطأ أدناه.

request.get ('https://10.10.24.20'، check = '/ etc / ssl / certs / certSIGN_ROOT_CA.pem')
Traceback (آخر مكالمة أخيرة):
ملف ""، السطر 1 ، في
ملف "/usr/local/lib/python2.7/dist-packages/requests/api.py" ، السطر 72 ، في get
طلب الإرجاع ('get'، url، params = params، * kwargs)ملف "/usr/local/lib/python2.7/dist-packages/requests/api.py" ، السطر 58 ، في الطلبإرجاع session.request (طريقة = طريقة ، url = url ، * kwargs)
ملف "/usr/local/lib/python2.7/dist-packages/requests/sessions.py" ، السطر 508 ، في الطلب
Resp = self.send (الإعدادية ، * send_kwargs)ملف "/usr/local/lib/python2.7/dist-packages/requests/sessions.py" ، السطر 618 ، في الإرسالr = adaptor.send (request، * kwargs)
ملف "/usr/local/lib/python2.7/dist-packages/requests/adapters.py" ، السطر 506 ، في الإرسال
رفع SSLError (e، request = request)
request.exceptions.SSLError: HTTPSConnectionPool (host = '10 .10.24.20 '، port = 443): تم تجاوز الحد الأقصى من عمليات إعادة المحاولة بعنوان url: / (سببها خطأ SSLE (خطأ SSLE ("خطأ اتصال خاطئ: خطأ ([(' SSL routines '،' tls_process_server_certificate '،' فشل التحقق من الشهادة ')] ،) "،))

إذا واصلت التحقق من False ، فإنه يعمل ولكني أريده مع التحقق = صحيح

لم أر هذا من قبل لذا فتحت عددًا جديدًا ، آسف لذلك. لكنني أواجه نفس المشكلة. بالنسبة لي ، فشل "الطلب" حتى مع التحقق = خطأ.

$ بيثون
Python 2.7.13 (افتراضي ، 19 كانون الثاني (يناير) 2017 ، 14:48:08)
[GCC 6.3.0 20170118] على linux2
اكتب "مساعدة" أو "حقوق طبع ونشر" أو "ائتمانات" أو "ترخيص" لمزيد من المعلومات.

طلبات الاستيراد
request.get ("https: // localhost: 9000 / getcpuinfo" ، تحقق = خطأ)
Traceback (آخر مكالمة أخيرة):
ملف ""، السطر 1 ، في
ملف "/usr/lib/python2.7/dist-packages/requests/api.py" ، السطر 70 ، في get
طلب الإرجاع ('get'، url، params = params، * kwargs)ملف "/usr/lib/python2.7/dist-packages/requests/api.py" ، السطر 56 ، في الطلبإرجاع session.request (طريقة = طريقة ، url = url ، * kwargs)
ملف "/usr/lib/python2.7/dist-packages/requests/sessions.py" ، السطر 488 ، في الطلب
Resp = self.send (الإعدادية ، * send_kwargs)ملف "/usr/lib/python2.7/dist-packages/requests/sessions.py" ، السطر 609 ، في الإرسالr = adaptor.send (request، * kwargs)
ملف "/usr/lib/python2.7/dist-packages/requests/adapters.py" ، السطر 497 ، في الإرسال
رفع SSLError (e، request = request)
request.exceptions.SSLError: ("bad handshake: SysCallError (-1، 'Unlimited EOF')"،)

معلومات شهادتي المحلية هي ،

$ openssl s_client -showcerts -connect localhost:9000
CONNECTED(00000003)
depth=0 CN = localhost
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = localhost
verify return:1
write:errno=0
---
Certificate chain
 0 s:/CN=localhost
   i:/CN=localhost
-----BEGIN CERTIFICATE-----
MIIC/jCCAeagAwIBAgIJAKATu2AY/QT4MA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
BAMMCWxvY2FsaG9zdDAeFw0xNzExMDkyMTQ1NTBaFw0xNzEyMDkyMTQ1NTBaMBQx
EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAJTPk5nao0wG/EDFGnq7BvXMkEZ5oUVq7PAUxWi+E/byJk924l7Z5kACgWBa
zQL0lLXLpdMk97EFGWMblz5Ehtqh7U8HaE9OZ6x/pesDTka+REnpXecklRrdZHX7
lfFnNIU58grPpB2GyUXrRdOtcPlaKXUo+VTd7PgwMtYVtt8pyTWxSB2MMYrqJGT8
78KX6trRzQLm7tas3U0jD59+R8j7gxU6FyFaNJBrkJ5T9kHGKOsAzSqZdCgRBjl5
i7xcXJfOAAnZ3jhGlY5DQht+HZDHhjkLG9kcZZhFDYteFk8drzbd3lBw96nLq+8A
Sy92FtQL4GiYSwZ0WVAmwmTCGjUCAwEAAaNTMFEwHQYDVR0OBBYEFLYjwGKbcV9h
sYHxe8l9UvXVivByMB8GA1UdIwQYMBaAFLYjwGKbcV9hsYHxe8l9UvXVivByMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHl7okBCJlms+cwfzLhs
sbyyuX2wgngxyvjy497zBmeh1TiueGPhOx9u/sfJSZmoUaeRd/zPGkp2DcPQ+Lo2
EHYrXMPE1Ecgpu/15JZ8jNuE+FwZb9lllULLwzq8pDkdbdsSRltdV/rFlZ2YkscB
c+xvVaCltw5KpKnY6AWHoqwoDcd8TZKzyKXLSuluKbHNC1lvg8cMzs6hFA9P92Ae
9P08AKLAIOGJ7QzRrXQIsAO4p9rHheeZeYQZyNiRrXPQUoWos4+OjynaNs+FabhN
XBtSl/GGPRRRfU/D9v4iKfQx15CEvs1AKn1Z6mIPF05pSqbgIoz2mJBV6UM7e+hz
TRs=
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=localhost
issuer=/CN=localhost
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1198 bytes and written 302 bytes
Verification error: self signed certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 5311B8500C8AF327083E1465FE1E1A6A98E0996B4791150A01D6B130C7F0549909A4BDCDED388E9EDE124BB6C50E150A
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1510599077
    Timeout   : 7200 (sec)
    Verify return code: 18 (self signed certificate)
    Extended master secret: no
---

من فضلك لا تخطف هذه القضية. بشكل عام ، يجب أن تستخدم Stack Overflow لطرح هذه الأسئلة: إذا قمت بزيادة تحميل المشكلة بالطلبات ، فأنت فقط تجعلني أميل إلى إغلاقها.

@ sg77 تم تمييز شهادتك CA=FALSE ، مما يجعلها غير مؤهلة لتكون شهادة مُصدرة. أظن أن curl يقوم بتخصيص الكود الخاص به لاستخدام هذه الشهادة كدبوس ، وليس كمرجع مصدق جذري. الطلبات لا تفعل ذلك: لا يمكن أن تكون هذه الشهادة مرجع مصدق جذري ، لذلك لا يتم التحقق من صحتها.

أوصي بسك شهادة جديدة باستخدام CA=TRUE ، أو حذف BasicConstraints تمامًا.

@ ashwini-kaklij ليس لدي أي فكرة عن سبب فشل التحقق ، لأنني لا أستطيع رؤية الشهادة. من فضلك لا تنشره هنا : وجه سؤالك إلى StackOverflow بدلاً من ذلك.

uttampawar سبب الخطأ هو عدم إعجاب الخادم بمصافحة TLS لسبب ما. في غياب مزيد من التفاصيل لا أستطيع تحديد السبب. من فضلك ، مرة أخرى ، خذ سؤالك إلى Stack Overflow.

Lukasa لم أقصد اختطاف المشكلة فقط. قد يكون هذا مكان خاطئ. أضفت تعليقاتي وملاحظاتي لأنني رأيت أنها ذات طبيعة مماثلة. أنا أقدر ملاحظاتك. سوف أسأل عن Stackoverflow. شكرا.

من فضلك لا تخطف هذه القضية. بشكل عام ، يجب أن تستخدم Stack Overflow لطرح هذه الأسئلة: إذا قمت بزيادة تحميل المشكلة بالطلبات ، فأنت فقط تجعلني أميل إلى إغلاقها.

@ sg77 تم تمييز شهادتك CA=FALSE ، مما يجعلها غير مؤهلة لتكون شهادة مُصدرة. أظن أن curl يقوم بتخصيص الكود الخاص به لاستخدام هذه الشهادة كدبوس ، وليس كمرجع مصدق جذري. الطلبات لا تفعل ذلك: لا يمكن أن تكون هذه الشهادة مرجع مصدق جذري ، لذلك لا يتم التحقق من صحتها.

أوصي بسك شهادة جديدة باستخدام CA=TRUE ، أو حذف BasicConstraints تمامًا.

@ ashwini-kaklij ليس لدي أي فكرة عن سبب فشل التحقق ، لأنني لا أستطيع رؤية الشهادة. من فضلك _ لا تنشره هنا_: قم بتوجيه سؤالك إلى StackOverflow بدلاً من ذلك.

uttampawar سبب الخطأ هو عدم إعجاب الخادم بمصافحة TLS لسبب ما. في غياب مزيد من التفاصيل لا أستطيع تحديد السبب. من فضلك ، مرة أخرى ، خذ سؤالك إلى Stack Overflow.

مرحبًا Lukasa - رأيت ردك للتو. لقد قمت بالرد على @ sg77 قائلاً "تم وضع علامة على شهادتك CA=FALSE ".

كيف تعرف أن هذا خطأ وأين / كيف يمكنني إعادة هذا إلى TRUE؟

شكرا.

يشبه نشر مفتاح الشهادة عبر الإنترنت نشر كلمة المرور الخاصة بك

تضمين التغريدة

يشبه نشر مفتاح الشهادة عبر الإنترنت نشر كلمة المرور الخاصة بك

أم لا. يُعد نشر المفتاح الخاص للشهادة مساويًا لكلمة المرور الخاصة بك.

كل مرجع مصدق في العمل لديه شهادته في كل نظام تشغيل ومتصفح سائد. هل يعطون كلمة المرور الخاصة بهم للجميع؟

https://en.wikipedia.org/wiki/Public-key_cryptography

يكاد يكون من المؤكد أن هذا الخطأ لأن الشهادة نفسها غير صالحة بطريقة ما. هل يمكنك تقديم الشهادة المشفرة PEM نفسها ، من فضلك؟

كيف يمكنني الوصول إلى هذه الشهادة؟

إذا كنت مبتدئًا في استخدام وحدة python requests وترغب في القيام ببعض الأشياء التي تتطلب الوصول إلى مواقع آمنة ، فهناك احتمال كبير بأن يُحكم عليك هذا الخطأ - Certificate verify failed ومثل جميع المبرمجين المبتدئين. سيتم إغراء استخدام auth = session.post( mysecureurl, verify=false)

لكن هذه ممارسة سيئة للغاية وقد تم تثبيطها بسبب الكثير من منشورات SO ، ولكن لا يزال المبتدئين يسيئون استخدام هذا لأن الخطأ صعب الإصلاح.
اسمحوا لي أن ألقي بعض الضوء على هذه المسألة.
يستخدم Python (pip) و Conda وأيًا كان البرنامج المستند إلى Python مخزن شهادات منفصل تمامًا مثل جميع المتصفحات. تستخدم مكتبة طلبات Python ملف CA الخاص بها افتراضيًا ، أو ستستخدم حزمة شهادات حزمة الشهادات إذا تم تثبيتها. أيضًا ، لا تستخدم النقطة شهادات النظام بخلاف curl do.
ومن ثم بالنسبة لـ requests ، عليك تحديد مخزن الشهادات يدويًا من خلال conda أو pip.

TLDR

  1. قم بتصدير كل سلسلة الشهادات المشفرة .cer باستخدام المتصفح وفقًا لهذه المدونة الرائعة المعروضة هنا. لاحظ أن هذه المدونة لا تتعلق بـ conda certstore ولكن git certstore وهي تقول فقط لتصدير الجذر ، ومع ذلك فقد قمت بتصدير جميع سلاسل الشهادات إلى ملفات منفصلة .
  2. بعد ذلك ، قم بتثبيت certifi باستخدام الأمر pip install certifi
  3. تحقق من المسار الافتراضي لمتجر الشهادة الخاص بـ conda أو python:

import ssl
ssl.get_default_verify_paths() أو
import certifi
certifi.where()

  1. بمجرد تحديد موقع الملف الافتراضي cacert.pem ، افتح هذا (ويفضل أن يكون في Notepad ++) وألحق كل الشهادة في نهاية الملف. (اعتن بترسيم الشهادة -----BEGIN CERTIFICATE----- و -----END CERTIFICATE----- ). احفظ الملف وهذا كل شيء.
    أو إذا كنت تستخدم conda ، فاستخدم أوامر conda:
    conda config --set ssl_verify <pathToYourFile>.crt
    (لقد لاحظت أن هذا الأمر يقوم بتحديث الأشياء في C:\Users\johndoe\.condarc )

  2. استخدم الكود أدناه للتحقق:
    import certifi
    auth = session.post('https://mysecuresite.com/', cert=());

أيضًا ، إذا كنت تستخدم نظام Linux ، فيمكنك تصدير cacert المخصص إلى ملف تعريف المستخدم على مستوى النظام ( .bashrc أو .bash_profile ) باستخدام هذا الرابط .

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