أهلا. أحاول الاتصال بخادم باستخدام 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 ،
نظام التشغيل ، وج).
راجع للشغل ، هذا هو 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؟
شكرا.
يشبه نشر مفتاح الشهادة عبر الإنترنت نشر كلمة المرور الخاصة بك
تضمين التغريدة
يشبه نشر مفتاح الشهادة عبر الإنترنت نشر كلمة المرور الخاصة بك
أم لا. يُعد نشر المفتاح الخاص للشهادة مساويًا لكلمة المرور الخاصة بك.
كل مرجع مصدق في العمل لديه شهادته في كل نظام تشغيل ومتصفح سائد. هل يعطون كلمة المرور الخاصة بهم للجميع؟
يكاد يكون من المؤكد أن هذا الخطأ لأن الشهادة نفسها غير صالحة بطريقة ما. هل يمكنك تقديم الشهادة المشفرة 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
.cer
باستخدام المتصفح وفقًا لهذه المدونة الرائعة المعروضة هنا. لاحظ أن هذه المدونة لا تتعلق بـ conda certstore ولكن git certstore وهي تقول فقط لتصدير الجذر ، ومع ذلك فقد قمت بتصدير جميع سلاسل الشهادات إلى ملفات منفصلة .certifi
باستخدام الأمر pip install certifi
import ssl
ssl.get_default_verify_paths()
أو
import certifi
certifi.where()
بمجرد تحديد موقع الملف الافتراضي cacert.pem
، افتح هذا (ويفضل أن يكون في Notepad ++) وألحق كل الشهادة في نهاية الملف. (اعتن بترسيم الشهادة -----BEGIN CERTIFICATE-----
و -----END CERTIFICATE-----
). احفظ الملف وهذا كل شيء.
أو إذا كنت تستخدم conda ، فاستخدم أوامر conda:
conda config --set ssl_verify <pathToYourFile>.crt
(لقد لاحظت أن هذا الأمر يقوم بتحديث الأشياء في C:\Users\johndoe\.condarc
)
استخدم الكود أدناه للتحقق:
import certifi
auth = session.post('https://mysecuresite.com/', cert=());
أيضًا ، إذا كنت تستخدم نظام Linux ، فيمكنك تصدير cacert المخصص إلى ملف تعريف المستخدم على مستوى النظام ( .bashrc
أو .bash_profile
) باستخدام هذا الرابط .
التعليق الأكثر فائدة
إذا كنت مبتدئًا في استخدام وحدة python
requests
وترغب في القيام ببعض الأشياء التي تتطلب الوصول إلى مواقع آمنة ، فهناك احتمال كبير بأن يُحكم عليك هذا الخطأ -Certificate verify failed
ومثل جميع المبرمجين المبتدئين. سيتم إغراء استخدامauth = session.post( mysecureurl, verify=false)
لكن هذه ممارسة سيئة للغاية وقد تم تثبيطها بسبب الكثير من منشورات SO ، ولكن لا يزال المبتدئين يسيئون استخدام هذا لأن الخطأ صعب الإصلاح.
اسمحوا لي أن ألقي بعض الضوء على هذه المسألة.
يستخدم Python (pip) و Conda وأيًا كان البرنامج المستند إلى Python مخزن شهادات منفصل تمامًا مثل جميع المتصفحات. تستخدم مكتبة طلبات Python ملف CA الخاص بها افتراضيًا ، أو ستستخدم حزمة شهادات حزمة الشهادات إذا تم تثبيتها. أيضًا ، لا تستخدم النقطة شهادات النظام بخلاف
curl
do.ومن ثم بالنسبة لـ
requests
، عليك تحديد مخزن الشهادات يدويًا من خلال conda أو pip.TLDR
.cer
باستخدام المتصفح وفقًا لهذه المدونة الرائعة المعروضة هنا. لاحظ أن هذه المدونة لا تتعلق بـ conda certstore ولكن git certstore وهي تقول فقط لتصدير الجذر ، ومع ذلك فقد قمت بتصدير جميع سلاسل الشهادات إلى ملفات منفصلة .certifi
باستخدام الأمرpip install certifi
import ssl
ssl.get_default_verify_paths()
أوimport certifi
certifi.where()
بمجرد تحديد موقع الملف الافتراضي
cacert.pem
، افتح هذا (ويفضل أن يكون في Notepad ++) وألحق كل الشهادة في نهاية الملف. (اعتن بترسيم الشهادة-----BEGIN CERTIFICATE-----
و-----END CERTIFICATE-----
). احفظ الملف وهذا كل شيء.أو إذا كنت تستخدم conda ، فاستخدم أوامر conda:
conda config --set ssl_verify <pathToYourFile>.crt
(لقد لاحظت أن هذا الأمر يقوم بتحديث الأشياء في
C:\Users\johndoe\.condarc
)استخدم الكود أدناه للتحقق:
import certifi
auth = session.post('https://mysecuresite.com/', cert=());
أيضًا ، إذا كنت تستخدم نظام Linux ، فيمكنك تصدير cacert المخصص إلى ملف تعريف المستخدم على مستوى النظام (
.bashrc
أو.bash_profile
) باستخدام هذا الرابط .