سؤال

أحاول التحقق من أن الهدف يعرض خدمة الويب 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 لقد عملت مرة أخرى مع عدم وجود تغييرات أخرى مطلوبة. هذا حل بسيط للغاية!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top