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.

È stato utile?

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
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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top