修改Python代码以使用SSL进行REST调用

时间:2010-09-13 21:03:17

标签: python rest ssl

我有Python代码来调用这样的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目前是HTTP网址。我想将其更改为使用SSL(“HTTPS”)。我如何才能以最简单的方式更改此代码以使用https?

2 个答案:

答案 0 :(得分:3)

不幸的是,urllib2httplib,至少在Python 2.7之前,在使用HTTPS时不会进行任何证书验证。结果是,您正在与未必识别的服务器交换信息(这有点像与未经验证的人交换秘密):这会破坏HTTPS的安全目的。

请参阅httplib (in Python 2.7)中的这句话:

  

注意:这不会做任何证书   验证

(这与httplib.HTTPSConnection能够发送客户端证书无关:这是keycer t参数的用途。)

有很多方法,例如:

答案 1 :(得分:1)

在您调用的URL中使用HTTPS://而不是HTTP://应该可以正常工作,至少在您尝试访问已知/验证的服务器时是这样。如有必要,您可以使用客户端SSL证书来保护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)