IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

acces a une page HTTPS avec urllib [Python 2.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut acces a une page HTTPS avec urllib
    Bonjour,

    Je voudrais accéder (via python) a une page en HTTPS.

    Pour une page en HTTP, j'aurai fait de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import urllib2
     
    #
    userAgent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
    print "userAgent:", userAgent
     
    #
    url = "http://www.developpez.com"
    ## url = "https://wiki.python.org"
    print "url:", url
     
    #
    headers = { "User-Agent" : userAgent }
    myRequest = urllib2.Request(url, data=None, headers=headers)
     
    #
    try: 
        response = urllib2.urlopen(myRequest)  
        print "response.code, response.msg: %s, %s"%(response.code, response.msg)
    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
    ce qui me donne la réponse suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    userAgent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
    url: http://www.developpez.com
    response.code, response.msg: 200, OK
    Lorsque je change l'url pour une autre en HTTPS, j'obtiens le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    userAgent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
    url: https://wiki.python.org
    can't connect, reason:  [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)
    Après un peu de recherche sur le net et dans la doc d'urllib2,
    je crois comprendre que ce qu'il manque, c'est le paramétrage de l'opener pour qu'il gère la connexion SSL.
    Je fais l'essai suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import urllib2
    import ssl
     
    #
    userAgent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
    print "userAgent:", userAgent
     
    #
    ## url = "http://www.developpez.com"
    url = "https://wiki.python.org"
    print "url:", url
     
    #
    headers = { "User-Agent" : userAgent }
    myRequest = urllib2.Request(url, data=None, headers=headers)
     
    # creation d'un opener configure pour une connexion SSL
    # ???
    context = ssl.create_default_context()
    myHTTPSHandler = urllib2.HTTPSHandler(context=context)
    myOpener = urllib2.build_opener(myHTTPSHandler)
    urllib2.install_opener(myOpener)
     
    #
    try: 
        response = urllib2.urlopen(myRequest)  
        print "response.code, response.msg: %s, %s"%(response.code, response.msg)
    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
    et j'obtiens le même résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    userAgent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
    url: https://wiki.python.org
    can't connect, reason:  [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)


    Si quelqu'un pouvait m’éclairer sur ce que je fais mal, je lui en serai grandement reconnaissant.
    merci par avance.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    salut,

    avec le tout premier code que tu donnes et en remplaçant l'url par https://wiki.python.org j'obtiens un OK perso.

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Je confirme, le premier code répond bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    userAgent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
    url: http://www.developpez.com
    response.code, response.msg: 200, OK
    ....
    userAgent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
    url: https://wiki.python.org
    response.code, response.msg: 200, OK

  4. #4
    Membre averti Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Points : 388
    Points
    388
    Par défaut

    Je confirme. je pense que tu peux te lancer maintenant !

  5. #5
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    c'est une bonne nouvelle que ça marche chez vous.

    pouvez-vous s'il vous plait lancer le code suivant:
    c'est juste pour voir si ça me donne des pistes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import urllib2
    import ssl
    import sys, platform
     
    #
    print "platform.system(), platform.release(), platform.version():", platform.system(), platform.release(), platform.version()
    print "sys.version:", sys.version
    print "ssl._OPENSSL_API_VERSION:", ssl._OPENSSL_API_VERSION
     
    #
    userAgent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
    print "userAgent:", userAgent
     
    #
    ## url = "http://www.developpez.com"
    url = "https://wiki.python.org"
    print "url:", url
     
    #
    headers = { "User-Agent" : userAgent }
    myRequest = urllib2.Request(url, data=None, headers=headers)
     
    # creation d'un opener configure pour une connexion SSL
    # ???
    ## context = ssl.create_default_context()
    ## myHTTPSHandler = urllib2.HTTPSHandler(context=context)
    ## myOpener = urllib2.build_opener(myHTTPSHandler)
    ## urllib2.install_opener(myOpener)
     
    #
    try: 
        response = urllib2.urlopen(myRequest)  
        print "response.code, response.msg: %s, %s"%(response.code, response.msg)
    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
    ça me donne le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    platform.system(), platform.release(), platform.version(): Windows XP 5.1.2600
    sys.version: 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)]
    ssl._OPENSSL_API_VERSION: (1, 0, 1, 10, 15)
    userAgent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
    url: https://wiki.python.org
    can't connect, reason:  [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)
    Est-ce que vous avez une configuration particuliere de SSL ?

    merci.

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    Citation Envoyé par KINENVEU Voir le message
    c'est une bonne nouvelle que ça marche chez vous.
    n'est-ce pas

    pouvez-vous s'il vous plait lancer le code suivant (...)
    c'est le même code que celui que tu as posté plus haut, avec quelques print en plus, donc même résultat (testé) ça me retourne bien un 200 OK

    Est-ce que vous avez une configuration particuliere de SSL ?
    non ssl._OPENSSL_API_VERSION retourne 1.0.2.1.15 chez moi

    • est-ce que quand tu vas sur https://wiki.python.org avec ton navigateurs tu as un avertissement concernant le certificat ?
    • est-ce que ça pourrait être un proxy/antivirus/firewall/autre sur ta machine qui filtre ?
    • quelle est ta version de python et d'urllib2 ? (vu sur l'output précédent, python 2.7.9 sur Windows XP, SSL 1.0.1.10.15)


    Edit: trouvé sur le net, il semble que ça corresponde au problème que tu décris : https://github.com/mtschirs/quizduel...mment-67207159

  7. #7
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    tu es sur quelle version de python ? sous quel os ?
    c'est ce genre de chose que je voulais savoir.

    Citation Envoyé par BufferBob Voir le message
    [*] est-ce que quand tu vas sur https://wiki.python.org avec ton navigateurs tu as un avertissement concernant le certificat ?
    pas d'avertissement, ça marche bien. je suis juste redirige vers : https://wiki.python.org/moin/

    est-ce que ça pourrait être un proxy/antivirus/firewall/autre sur ta machine qui filtre ?
    pas a ma connaissance.


    normalement, ce n’était pas sensé fonctionner le fetch urllib2 avec https.
    c'est pourquoi je voulais faire le paramétrage du handler HTTPS dans l'opener.

    mais comme ça fonctionne chez vous, je voudrais savoir pourquoi, pour pouvoir le faire fonctionner chez moi.

  8. #8
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    avec cette modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if hasattr(ssl, '_create_unverified_context'):
      ssl._create_default_https_context = ssl._create_unverified_context
    ça a l'air de fonctionner chez moi.

    je regarde ça plus en détails des que j'ai un peu de temps.

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    Citation Envoyé par KINENVEU Voir le message
    tu es sur quelle version de python ? sous quel os ?
    j'ai pas précisé effectivement, je suis en python 2.7.10 sous win ici

    pas d'avertissement, ça marche bien. je suis juste redirige vers : https://wiki.python.org/moin/
    comportement HTTP normal donc

    normalement, ce n’était pas sensé fonctionner le fetch urllib2 avec https.
    c'est pourquoi je voulais faire le paramétrage du handler HTTPS dans l'opener.
    jusqu'à assez récemment Python ne vérifiait pas si le certificat était valide ou non, on trouve une entrée dans le bugtracker mais difficile de dire quelles versions prennent en compte le changement (dans le précédent lien que je t'ai donné il est question de 2.7.9 comme version charnière)

    au flairomètre, mettre à jour Python doit solutionner ton problème, à vérifier.

    Edit: dans le changelog on trouve la référence au bug #22417 "verify HTTPS certificates by default" sous la version 2.7.9rc1

  10. #10
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    d’après ce que je lis, il vaut mieux changer le comportement au niveau de la requête, plutôt qu'au niveau de la bibliothèque.
    Cela évite de le propager a d'autres endroits.

    cf. : https://www.python.org/dev/peps/pep-0476

    donc la modification se fait comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myContext = ssl._create_unverified_context()
    response = urllib2.urlopen(myRequest, context=myContext)
    Ça me permet d'obtenir la page que je voulais, mais finalement ce n'est pas terrible niveau sécurité/principe.

    Normalement, urllib vérifie "dans la bdd système" le certificat.
    c'est cette étape qui semble coincée.

    Est-ce que quelqu'un sait comment accéder a cette bdd ?
    éventuellement pouvoir valider manuellement le certificat du serveur une fois afin qu'il le reconnaisse tout simplement a chaque requête ?
    J'ai l'impression que c'est plutôt comme ça qu'il faudrait faire. non ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accès impossible aux pages https avec IE
    Par quadra38 dans le forum Windows 7
    Réponses: 2
    Dernier message: 14/12/2014, 19h45
  2. Accès à une page PHP avec HTTPS
    Par OodamienoO dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 20/05/2011, 15h55
  3. Accès d'une page php avec une iframe
    Par gianni7033 dans le forum Langage
    Réponses: 4
    Dernier message: 24/07/2009, 18h00
  4. Empêcher l'accès direct à une page avec les sessions
    Par Loupinou dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2009, 19h25
  5. Accés a une page HTTPS
    Par vins25 dans le forum Apache
    Réponses: 4
    Dernier message: 02/02/2006, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo