Connessione HTTPS Python
Domanda
Sto cercando di verificare che quella destinazione esponga un servizio web https.Ho il codice per connettermi tramite HTTP ma non sono sicuro di come connettermi tramite HTTPS.Ho letto che usi SSL ma ho anche letto che non supporta gli errori del certificato.Il codice che ho ottenuto proviene dai documenti Python:
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason
Qualcuno sa come connettersi a HTTPS?
Ho già provato HTTPSConenction ma risponde con un codice di errore che afferma che httplib non ha l'attributo HTTPSConnection.Inoltre non ho socket.ssl disponibile.
Ho installato Python 2.6.4 e non penso che abbia il supporto SSL compilato al suo interno.C'è un modo per integrare questo supporto nel nuovo Python senza doverlo installare di nuovo.
Ho installato OpenSSL e pyOpenSsl e ho provato il codice seguente da una delle risposte:
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
Ho ricevuto un errore:
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'
Qualcuno sa come farlo funzionare?
-- UPDATE
Ho scoperto qual era il problema, la versione Python che stavo usando non aveva il supporto per SSL.Ho trovato questa soluzione attualmente su: http://www.webtop.com.au/compiling-python-with-ssl-support.
Il codice ora funzionerà dopo questa soluzione, il che è molto buono.Quando importo SSL e HTTPSConnection so di non ricevere un errore.
Grazie per l'aiuto a tutti.
Soluzione
Python 2.x: docs.python.org/2/library/httplib.html:
Nota:Il supporto HTTPS è disponibile solo se il modulo socket è stato compilato con il supporto SSL.
Python 3.x: docs.python.org/3/library/http.client.html:
Nota il supporto HTTPS è disponibile solo se Python è stato compilato con il supporto SSL (tramite il modulo 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 ....
Per verificare se SSL è abilitato, prova:
>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>
Altri suggerimenti
Per verificare supporto SSL in Python 2.6+:
try:
import ssl
except ImportError:
print "error: no ssl support"
Per connettersi tramite 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
utilizzando
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
Perché non hai provato httplib.HTTPSConnection?Non esegue la convalida SSL ma non è necessaria per connettersi tramite https.Il tuo codice funziona bene con la connessione https:
>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
Se si utilizza httplib.HTTPSConnessione:
Per favore dai un'occhiata a:Modificato nella versione 2.7.9:
Questa classe ora esegue tutti i controlli necessari sui certificati e sui nomi host per impostazione predefinita.Per ripristinare il comportamento precedente, non verificato, è possibile passare ssl._create_unverified_context() al parametro context.Puoi usare:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
Supponendo che il supporto SSL sia abilitato per socket
modulo.
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
Avevo del codice che non funzionava con un HTTPConnection (MOVED_PERMANENTLY error)
, ma non appena sono passato a HTTPS
ha funzionato di nuovo perfettamente senza bisogno di altre modifiche.È una soluzione molto semplice!