我有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?
答案 0 :(得分:3)
不幸的是,urllib2
和httplib
,至少在Python 2.7之前,在使用HTTPS时不会进行任何证书验证。结果是,您正在与未必识别的服务器交换信息(这有点像与未经验证的人交换秘密):这会破坏HTTPS的安全目的。
请参阅httplib (in Python 2.7)中的这句话:
注意:这不会做任何证书 验证
(这与httplib.HTTPSConnection
能够发送客户端证书无关:这是key
和cer
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)