J'essaie de vérifier que la cible expose un service Web https. J'ai du code pour me connecter via HTTP mais je ne sais pas comment me connecter via HTTPS. J'ai lu que vous utilisiez SSL mais j'ai aussi lu qu'il ne supportait pas les erreurs de certificat. Le code que j'ai obtenu provient du python docs:
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason
Est-ce que quelqu'un sait comment se connecter à HTTPS?
J'ai déjà essayé HTTPSConenction mais il répond par un code d'erreur, affirmant que httplib n'a pas d'attribut HTTPSConnection. Je n'ai pas non plus de socket.ssl disponible.
J'ai installé Python 2.6.4 et je ne pense pas qu'il contienne un support SSL compilé. Existe-t-il un moyen d'intégrer ce support dans le plus récent python = sans avoir à l'installer à nouveau.
J'ai installé OpenSSL et pyOpenSsl et j'ai essayé le code ci-dessous à partir d'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'
Est-ce que quelqu'un sait comment faire fonctionner cela?
-- UPDATE
J'ai découvert quel était le problème, la Python que j'utilisais ne prenait pas en charge SSL). J'ai trouvé cette solution à l'adresse suivante: http: //www.webtop .com.au/compilation-python-avec-ssl-support .
Le code va maintenant fonctionner après cette solution qui est très bonne. Lorsque j'importe ssl et HTTPSConnection, je ne reçois pas d'erreur.
Merci pour l'aide tous.
Python 2.x: docs.python.org/2/library/httplib.html :
Remarque: La prise en charge HTTPS n'est disponible que si le module de socket a été compilé avec la prise en charge SSL.
Python 3.x: docs.python.org/3/library/http.client.html :
Remarque La prise en charge HTTPS est uniquement disponible si Python a été compilé avec la prise en charge de SSL (via le module 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 ....
Pour vérifier si SSL est activé, essayez:
>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>
Pour vérifier support ssl dans Python 2.6 + :
try:
import ssl
except ImportError:
print "error: no ssl support"
Pour vous 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
import requests
r = requests.get("https://stackoverflow.com")
data = r.content # Content of response
print r.status_code # Status code of response
print data
en utilisant
class httplib.HTTPSConnection
http://docs.python.org/library/httplib.html#httplib.HTTPSConnection
Si vous utilisez httplib.HTTPSConnection:
Veuillez jeter un coup d'oeil à: Modifié dans la version 2.7.9:
Cette classe effectue maintenant toutes les vérifications de certificat et de nom d’hôte nécessaires par défaut. Pour revenir au comportement précédent, non vérifié, ssl._create_unverified_context () peut être passé au paramètre context. Vous pouvez utiliser:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
Pourquoi n'avez-vous pas essayé httplib.HTTPSConnection? La validation SSL n'est pas nécessaire, mais cela n'est pas obligatoire pour se connecter via https. Votre code fonctionne bien avec la connexion https:
>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
En supposant que la prise en charge de SSL soit activée pour le module socket
.
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')