web-dev-qa-db-fra.com

Connexion HTTPS Python

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.

41
chrissygormley

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>
64
miku

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
12
jfs
import requests
r = requests.get("https://stackoverflow.com") 
data = r.content  # Content of response

print r.status_code  # Status code of response
print data
9
ori
9
bluszcz

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
5
user260826

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
5
Piotr Czapla

En supposant que la prise en charge de SSL soit activée pour le module socket.

connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
4
Tendayi Mawushe