修改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 个回答
3
很遗憾的是,在Python 2.7及之前的版本中,urllib2
和httplib
在使用HTTPS时并不会进行任何证书验证。这意味着你可能在和一个你并不确定身份的服务器交换信息(就像和一个你不认识的人交换秘密一样):这就违背了HTTPS的安全目的。
这里有一段来自httplib(在Python 2.7中)的说明:
注意:这并不进行任何证书验证。
(这和httplib.HTTPSConnection
能够发送客户端证书是两回事:它的key
和cer
t参数就是用来这个的。)
不过,有一些解决方法,比如:
1
只要在你调用的URL中把HTTP://换成HTTPS://就可以了,至少如果你是想连接一个已知或经过验证的服务器的话。如果需要的话,你还可以使用你自己电脑上的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)