修改Python代码以在REST调用中使用SSL

3 投票
2 回答
8887 浏览
提问于 2025-04-16 04:06

我有一段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及之前的版本中,urllib2httplib在使用HTTPS时并不会进行任何证书验证。这意味着你可能在和一个你并不确定身份的服务器交换信息(就像和一个你不认识的人交换秘密一样):这就违背了HTTPS的安全目的。

这里有一段来自httplib(在Python 2.7中)的说明:

注意:这并不进行任何证书验证。

(这和httplib.HTTPSConnection能够发送客户端证书是两回事:它的keycert参数就是用来这个的。)

不过,有一些解决方法,比如:

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)

撰写回答