HTTPS Connection Python
سؤال
أحاول التحقق من أن الهدف يعرض خدمة الويب HTTPS. لدي رمز للاتصال عبر HTTP لكنني لست متأكدًا من كيفية الاتصال عبر HTTPS. لقد قرأت أنك تستخدم SSL ، لكنني قرأت أيضًا أنه لا يدعم أخطاء الشهادة. الرمز الذي لدي هو من مستندات بيثون:
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason
هل يعرف أي شخص كيفية الاتصال بـ HTTPS؟
لقد جربت بالفعل httpsconenction ولكنه يستجيب برمز خطأ يزعم أن httplib لا يحتوي على السمة httpsconnection. كما أنني لا أتوفر socket.ssl.
لقد قمت بتثبيت Python 2.6.4 ولا أعتقد أنه يحتوي على دعم SSL الذي تم تجميعه فيه. هل هناك طريقة لدمج هذا النور في ثعبان الأحدث دون الحاجة إلى تثبيته مرة أخرى.
لقد قمت بتثبيت OpenSSL و Pyopenssl وقد جربت الرمز أدناه من أحد الإجابات:
import urllib2
from OpenSSL import SSL
try:
response = urllib2.urlopen('https://example.com')
print 'response headers: "%s"' % response.info()
except IOError, e:
if hasattr(e, 'code'): # HTTPError
print 'http error code: ', e.code
elif hasattr(e, 'reason'): # URLError
print "can't connect, reason: ", e.reason
else:
raise
لدي خطأ:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 87, in urlopen
return opener.open(url)
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 203, in open
return self.open_unknown(fullurl, data)
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 215, in open_unknown
raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'
هل يعرف أي شخص كيفية عمل هذا العمل؟
-- UPDATE
لقد اكتشفت ما هي المشكلة ، فإن إصدار Python الذي كنت أستخدمه لم يكن لديه دعم لـ SSL. لقد وجدت هذا الحل حاليا في: http://www.webtop.com.au/compiling-python-with-ssl-support.
سوف يعمل الرمز الآن بعد هذا الحل وهو جيد جدًا. عندما أقوم باستيراد SSL و HTTPSconnection ، لا أعرف لا تحصل على خطأ.
شكرا لمساعتكم جميعا.
المحلول
بيثون 2.x: docs.python.org/2/library/httplib.html:
ملاحظة: يتوفر دعم HTTPS فقط إذا تم تجميع وحدة المقبس بدعم SSL.
بيثون 3.x: docs.python.org/3/library/http.client.html:
لاحظ أن دعم HTTPS متاح فقط إذا تم تجميع Python بدعم SSL (من خلال وحدة SSL).
#!/usr/bin/env python
import httplib
c = httplib.HTTPSConnection("ccc.de")
c.request("GET", "/")
response = c.getresponse()
print response.status, response.reason
data = response.read()
print data
# =>
# 200 OK
# <!DOCTYPE html ....
للتحقق مما إذا تم تمكين SSL ، حاول:
>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>
نصائح أخرى
للتحقق من دعم SSL في Python 2.6+:
try:
import ssl
except ImportError:
print "error: no ssl support"
للاتصال عبر https:
import urllib2
try:
response = urllib2.urlopen('https://example.com')
print 'response headers: "%s"' % response.info()
except IOError, e:
if hasattr(e, 'code'): # HTTPError
print 'http error code: ', e.code
elif hasattr(e, 'reason'): # URLError
print "can't connect, reason: ", e.reason
else:
raise
استخدام
class httplib.HTTPSConnection
http://docs.python.org/library/httplib.html#httplib.httpsconnection
import requests
r = requests.get("https://stackoverflow.com")
data = r.content # Content of response
print r.status_code # Status code of response
print data
لماذا لم تجرب httplib.httpsconnection؟ لا يقوم بالتحقق من صحة SSL ، لكن هذا غير مطلوب للاتصال عبر HTTPS. يعمل الكود الخاص بك بشكل جيد مع اتصال HTTPS:
>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
إذا كنت تستخدم httplib.httpsconnection:
يرجى إلقاء نظرة على: تم تغيير في الإصدار 2.7.9:
تقوم هذه الفئة الآن بجميع الشيكات الضرورية وأسماء المضيف بشكل افتراضي. للعودة إلى السلوك السابق ، يمكن نقل السلوك ssl._create_unverified_context () إلى معلمة السياق. يمكنك استخدام:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
على افتراض تم تمكين دعم SSL ل socket
وحدة.
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
كان لدي بعض الكود الذي فشل مع HTTPConnection (MOVED_PERMANENTLY error)
, ، ولكن بمجرد أن تحولت إلى HTTPS
لقد عملت مرة أخرى مع عدم وجود تغييرات أخرى مطلوبة. هذا حل بسيط للغاية!