2010-01-27 42 views
34

Tôi đang cố gắng xác minh mục tiêu đó sẽ hiển thị một dịch vụ web https. Tôi có mã để kết nối qua HTTP nhưng tôi không chắc chắn cách kết nối qua HTTPS. Tôi đã đọc bạn sử dụng SSL nhưng tôi cũng đã đọc rằng nó không hỗ trợ lỗi chứng chỉ. Mã tôi nhận được là từ tài liệu trăn:Kết nối HTTPS Python

import httplib 
conn = httplib.HTTPConnection("www.python.org") 
conn.request("GET", "/index.html") 
r1 = conn.getresponse() 
print r1.status, r1.reason 

Có ai biết cách kết nối với HTTPS không?

Tôi đã thử HTTPSConenction nhưng nó phản hồi bằng mã lỗi tuyên bố httplib không có thuộc tính HTTPSConnection. Tôi cũng không có socket.ssl.

Tôi đã cài đặt Python 2.6.4 và tôi không nghĩ rằng nó có hỗ trợ SSL được biên dịch vào đó. Có cách nào để tích hợp này suppot vào python mới hơn mà không cần phải cài đặt nó một lần nữa.

Tôi đã cài đặt OpenSSL và pyOpenSsl và tôi đã thử đoạn code dưới đây từ một trong những câu trả lời:

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 

Tôi đã có một lỗi:

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' 

Có ai biết làm thế nào để có được điều này đang làm việc?

-- UPDATE 

Tôi đã phát hiện ra vấn đề là gì, phiên bản Python tôi đang sử dụng không hỗ trợ SSL. Tôi đã tìm thấy giải pháp này hiện tại: http://www.webtop.com.au/compiling-python-with-ssl-support.

Mã bây giờ sẽ hoạt động sau giải pháp này rất tốt. Khi tôi nhập ssl và HTTPSConnection, tôi biết không gặp lỗi.

Cảm ơn bạn đã trợ giúp tất cả.

Trả lời

59

Python 2.x: docs.python.org/2/library/httplib.html:

Note: HTTPS support is only available if the socket module was compiled with SSL support.

Python 3.x: docs.python.org/3/library/http.client.html:

Note HTTPS support is only available if Python was compiled with SSL support (through the ssl module).

#!/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 .... 

Để xác minh nếu SSL được bật, hãy thử:

>>> import socket 
>>> socket.ssl 
<function ssl at 0x4038b0> 
+8

Lưu ý rằng điều này không xác minh chứng chỉ từ xa, do đó bạn không thực sự nhận được bảo mật theo cách này (vì bạn thực sự không biết bạn đang thực sự nói đến máy chủ nào). – Bruno

+0

Liên kết đã chết. – SwiftsNamesake

3

Tại sao chưa bạn đã cố gắng httplib.HTTPSConnection? Nó không thực hiện xác thực SSL nhưng không bắt buộc phải kết nối qua https. Mã của bạn hoạt động tốt với https kết nối:

>>> import httplib 
>>> conn = httplib.HTTPSConnection("mail.google.com") 
>>> conn.request("GET", "/") 
>>> r1 = conn.getresponse() 
>>> print r1.status, r1.reason 
200 OK 
4

Giả sử hỗ trợ SSL được bật cho mô-đun socket.

connection1 = httplib.HTTPSConnection('www.somesecuresite.com') 
11

Để kiểm tra các ssl support in Python 2.6+:

try: 
    import ssl 
except ImportError: 
    print "error: no ssl support" 

Để kết nối qua 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 
+4

+1 để sử dụng 'example.com'. – jww

5
import requests 
r = requests.get("https://stackoverflow.com") 
data = r.content # Content of response 

print r.status_code # Status code of response 
print data 
5

Nếu sử dụng httplib.HTTPSConnection:

Hãy xem tại: Thay đổi trong phiên bản 2.7.9:

Lớp này hiện thực hiện tất cả các chứng chỉ cần thiết và kiểm tra tên máy chủ theo mặc định. Để hoàn nguyên về hành vi trước đó, chưa được xác minh, ssl._create_unverified_context() có thể được chuyển tới tham số ngữ cảnh. Bạn có thể sử dụng:

if hasattr(ssl, '_create_unverified_context'): 
      ssl._create_default_https_context = ssl._create_unverified_context 
0

tôi đã có một số mã mà đã thất bại với một HTTPConnection (MOVED_PERMANENTLY error), nhưng ngay sau khi tôi chuyển sang HTTPS nó làm việc một cách hoàn hảo một lần nữa không có những thay đổi khác cần thiết. Đó là một sửa chữa rất đơn giản!

+0

Điều này khác với các câu trả lời khác như thế nào? Có thể cố gắng xây dựng thêm một chút. – mpaskov

Các vấn đề liên quan