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.

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top