2010-09-13 3 views
3

J'ai du code Python pour appeler un service REST qui est quelque chose comme ceci:Modification du code Python pour utiliser SSL pour un appel REST

import urllib 
import urllib2 

username = 'foo' 
password = 'bar' 

passwordManager = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passwordManager .add_password(None, MY_APP_PATH, username, password) 
authHandler = urllib2.HTTPBasicAuthHandler(passwordManager) 
opener = urllib2.build_opener(authHandler) 
urllib2.install_opener(opener) 

params= { "param1" : param1, 
      "param2" : param2, 
      "param3" : param3 } 

xmlResults = urllib2.urlopen(MY_APP_PATH, urllib.urlencode(params)).read() 
results = MyResponseParser.parse(xmlResults) 

MY_APP_PATH est actuellement une URL HTTP. Je voudrais le changer pour utiliser SSL ("HTTPS"). Comment pourrais-je changer ce code pour utiliser https de la manière la plus simple possible?

+1

Avez-vous essayé de définir MY_APP_PATH dans l'URL '' https: // ... ''? A-t-il échoué? Comment? Quelle est la traceback d'erreur complète? – nosklo

Répondre

1

L'utilisation de HTTPS: // au lieu de HTTP: // dans l'URL que vous appelez devrait fonctionner, au moins si vous essayez d'atteindre un serveur connu/vérifié. Si nécessaire, vous pouvez utiliser votre certificat SSL côté client pour sécuriser la transaction API:

mykey = '/path/to/ssl_key_file' 
mycert = '/path/to/ssl_cert_file' 
opener = urllib2.build_opener(HTTPSClientAuthHandler(mykey, mycert)) 
opener.add_handler(urllib2.HTTPBasicAuthHandler()) # add HTTP Basic Authentication information... 
opener.add_password(user=settings.USER_ID, passwd=settings.PASSWD) 
+0

Sauf que ce n'est pas sécurisé ... Vous devez d'abord vérifier le certificat * server *. – Bruno

+0

Hmm, tire, tu as raison. – Dick

3

Malheureusement, urllib2 et httplib, au moins jusqu'à Python 2.7 ne font aucune vérification de certificat pour l'utilisation de HTTPS. Le résultat est que vous échangez des informations avec un serveur que vous n'avez pas nécessairement identifié (c'est un peu comme échanger un secret avec quelqu'un dont vous n'avez pas vérifié l'identité): cela va à l'encontre de l'objectif de sécurité de HTTPS.

Voir cette citation de httplib (in Python 2.7):

Note: Cela ne fait pas de certificat de vérification .

(Ceci est indépendant de httplib.HTTPSConnection être en mesure d'envoyer un certificat de client: c'est ce que ses key et cer paramètres t sont pour.)

Il y a plusieurs façons de contourner cela, par exemple:

Questions connexes