Python请求打印用于HTTPS的密码

时间:2016-03-19 13:38:06

标签: python ssl python-requests

我开发了一个带有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()))

非常感谢您的帮助

1 个答案:

答案 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语句的唯一原因。如果要对输出进行更多控制,可以用调试记录器替换打印功能。

在代码的开头导入或粘贴此代码段,以便它可以尽早修补该方法。