Connexion HTTPS Python
Question
Je suis en train de vérifier le qui cible expose un https service web.J'ai le code pour se connecter via HTTP, mais je ne suis pas sûr de la façon de se connecter via HTTPS.J'ai lu que vous utilisez SSL, mais j'ai aussi lu qu'il ne supporte pas les erreurs de certificat.Le code que j'ai est du python docs:
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason
Personne ne sait comment faire pour se connecter en HTTPS?
J'ai déjà essayé le HTTPSConenction mais il répond avec un code d'erreur en prétendant httplib n'ont pas l'attribut HTTPSConnection.Je n'ai pas l'avoir prise.ssl sont disponibles.
J'ai installé Python 2.6.4 et je ne pense pas que le support SSL, compilées.Est-il un moyen d'intégrer ce suppot dans la nouvelle python sans avoir à l'installer à nouveau.
J'ai installé OpenSSL et pyOpenSsl et j'ai essayé le code ci-dessous à partir de l'une des réponses:
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
J'ai une erreur:
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'
Personne ne sait comment le faire fonctionner?
-- UPDATE
J'ai trouvé quel était le problème, la version de Python que j'utilisais n'ont pas de support pour SSL.J'ai trouvé cette solution actuellement à: http://www.webtop.com.au/compiling-python-with-ssl-support.
Le code fonctionne maintenant après cette solution qui est très bon.Quand je l'importation ssl et HTTPSConnection je sais ne pas obtenir une erreur.
Merci pour l'aide de tous.
La solution
Python 2.x: docs.python.org/2/library/httplib.html:
Note:Prise en charge de HTTPS est disponible uniquement si le support module a été compilé avec le support SSL.
Python 3.x: docs.python.org/3/library/http.client.html:
Remarque prise en charge de HTTPS est disponible uniquement si Python a été compilé avec le support de SSL (par la ssl du 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 ....
Pour vérifier si le protocole SSL est activé, essayez de:
>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>
Autres conseils
Pour vérifier prise en charge de ssl en Python 2.6+:
try:
import ssl
except ImportError:
print "error: no ssl support"
Pour se connecter via 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
à l'aide de
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
Pourquoi n'avez-vous pas essayé httplib.HTTPSConnection?Il ne fait pas de SSL de validation, mais ce n'est pas nécessaire de se connecter via https.Votre code fonctionne très bien avec une connexion https:
>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
Si vous utilisez httplib.HTTPSConnection:
Veuillez jeter un oeil à:Modifié dans la version 2.7.9:
Cette classe effectue désormais tout le nécessaire de certificat et le nom d'hôte vérifie par défaut.Pour revenir à la précédente, non vérifiées, le comportement ssl._create_unverified_context() peut être passé pour le paramètre de contexte.Vous pouvez utiliser:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
En supposant que le support SSL est activé pour le socket
le module.
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
J'ai eu un peu de code qui n'était pas à avec une HTTPConnection (MOVED_PERMANENTLY error)
, mais dès que je suis passé à HTTPS
il a parfaitement fonctionné de nouveau avec aucune autre modification nécessaire.C'est très simple fix!