如何从CherryPy处理程序获取SSL客户端证书信息?

时间:2020-07-18 15:14:36

标签: ssl cherrypy

我能够使用以下代码将CherryPy HTTPServer设置为要求SSL客户端证书:

ssl_certificate = os.environ.get("SSL_CERTIFICATE")
ssl_adapter = BuiltinSSLAdapter(
    certificate=ssl_certificate,
    private_key=os.environ["SSL_PRIVATE_KEY"],
    certificate_chain=os.environ.get("SSL_CERTIFICATE_CHAIN")
)
verify_mode = ssl.CERT_REQUIRED
ssl_adapter.context.verify_mode = verify_mode
HTTPServer.ssl_adapter = ssl_adapter

现在,我正在尝试从请求处理程序中获取SSL客户端认证信息,但是我不知道该怎么做。阅读https://github.com/cherrypy/cheroot/blob/master/cheroot/ssl/builtin.py#L419之后,似乎应该使用SSL_CLIENT *变量填充wsgi环境变量。我无法从请求对象中找到任何方法/属性,无法让我获取此类信息

如何从请求处理程序中获取此变量?

1 个答案:

答案 0 :(得分:0)

我通过与Gitter上的CherryPy维护者的对话中学到了答案。

CherryPy请求对象可能包含比API source中记录的属性更多的属性,一旦在WSGI处理中创建了请求对象,就可以动态设置这些属性:

https://github.com/cherrypy/cherrypy/blob/master/cherrypy/_cpwsgi.py#L319

...
        request.multithread = self.environ['wsgi.multithread']
        request.multiprocess = self.environ['wsgi.multiprocess']
        request.wsgi_environ = self.environ
...

知道这一点,要获得包含SSL *变量的WSGI环境,我们只需导入请求对象即可访问它:

import cherrypy.request
...
print(cherrypy.request.wsgi_environ)
...