我开发了一个带有SSL(TLSv1-TLSv1.2)的CherryPy REST服务,并禁用了密码和不安全的协议。
现在我有另一段代码使用Python请求连接到这个服务。我已经写了一个TLS HTTPAdapter并且请求成功了。我只有一个问题:
我既没有看到在服务器端也没在客户端选择了什么密码。事实上,如果我的安全选择发生,我真的不知道。我无法找到如何从为CherryPy或请求调用的内置Python模块中获取SSLSocket.cipher()。
有没有简单的方法来获取此信息?
以下是一个例子:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
class Tlsv1_2HttpAdapter(HTTPAdapter):
""""Transport adapter" that allows us to use TLSv1.2"""
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(
num_pools=connections, maxsize=maxsize,
block=block, ssl_version=ssl.PROTOCOL_TLSv1_2)
con = "https://{}:{}".format(host, port)
tls = Tlsv1_2HttpAdapter()
try:
s = requests.Session()
s.mount(con, tls)
r = s.get(con)
except requests.exceptions.SSLError as e:
print(e, file=sys.stderr)
sys.exit(1)
我想要类似:print(“Cipher used:{}”。format(foo.cipher()))
非常感谢您的帮助
答案 0 :(得分:0)
作为一种临时的测试解决方案,下面的代码会打印出如下的密码套件(位置0)和协议(位置1):
('ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256)
Python 2.7(已测试):
from httplib import HTTPConnection
def request(self, method, url, body=None, headers={}):
self._send_request(method, url, body, headers)
print(self.sock.cipher())
HTTPConnection.request = request
Python 3(未经测试):
from http.client import HTTPConnection
def request(self, method, url, body=None, headers={}, *,
encode_chunked=False):
self._send_request(method, url, body, headers, encode_chunked)
print(self.sock.cipher())
HTTPConnection.request = request
这是猴子添加request()
方法的补丁,只是添加了print语句的唯一原因。如果要对输出进行更多控制,可以用调试记录器替换打印功能。
在代码的开头导入或粘贴此代码段,以便它可以尽早修补该方法。