2010-01-27 6 views
34

J'essaie de vérifier que la cible expose un service Web https. J'ai un code pour me connecter via HTTP mais je ne suis pas sûr de savoir comment se connecter via HTTPS. J'ai lu que vous utilisez SSL mais j'ai également lu qu'il ne supportait pas les erreurs de certificat. Le code que j'ai obtenu provient des docs python:Connexion HTTPS Python

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é le HTTPSConenction mais il répond avec un code d'erreur indiquant que httplib n'a pas d'attribut HTTPSConnection. Je n'ai pas non plus socket.ssl ​​disponible.

J'ai installé Python 2.6.4 et je ne pense pas qu'il ait compilé le support SSL. Est-il possible d'intégrer ce suppot dans le nouveau python sans avoir à l'installer à nouveau.

J'ai installé OpenSSL et pyopenssl et j'ai essayé le code ci-dessous 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' 

Est-ce que quelqu'un sait comment obtenir ce travail?

-- UPDATE 

J'ai découvert le problème, la version Python que j'utilisais ne supportait pas SSL. J'ai trouvé cette solution actuellement à: http://www.webtop.com.au/compiling-python-with-ssl-support.

Le code va maintenant fonctionner après cette solution qui est très bonne. Quand j'importe ssl et HTTPSConnection, je sais qu'il n'y a pas d'erreur.

Merci pour l'aide à tous.

Répondre

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

Pour vérifier si SSL est activé, essayez:

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

Notez que cela ne vérifie pas le certificat distant, donc vous n'obtenez pas vraiment de sécurité de cette façon (car vous ne savez pas vraiment à quel serveur vous êtes réellement en train de parler). – Bruno

+0

Le lien est mort. – SwiftsNamesake

3

Pourquoi vous n'avez pas essayé httplib.HTTPSConnection? Il ne fait pas de validation SSL, mais cela n'est pas nécessaire pour se connecter via https. Votre code fonctionne bien avec connexion https:

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

En supposant que le support SSL est activé pour le module socket.

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

Pour vérifier ssl support in 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 
+4

+1 pour l'utilisation de '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

Si vous utilisez httplib.HTTPSConnection:

Veuillez jeter un 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 
0

j'avais un code qui échouait avec un HTTPConnection (MOVED_PERMANENTLY error), mais dès que je suis passé à HTTPS cela a fonctionné parfaitement à nouveau sans autres changements nécessaires. C'est une solution très simple!

+0

En quoi est-ce différent par rapport aux autres réponses? Peut-être essayer d'élaborer un peu plus. – mpaskov

Questions connexes