【问题标题】:How do I get the SSL client certificate information from a CherryPy handler?如何从 CherryPy 处理程序获取 SSL 客户端证书信息?
【发布时间】:2020-07-18 15:14:36
【问题描述】:

我能够使用以下代码将 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 环境变量。我无法从请求对象中找到任何方法/属性将允许我获取此类信息

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

【问题讨论】:

    标签: ssl cherrypy


    【解决方案1】:

    我从与 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)
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多