【问题标题】:accessing client's x509 certificate from within twisted web WSGI app从 Twisted Web WSGI 应用程序中访问客户端的 x509 证书
【发布时间】:2016-08-17 10:16:21
【问题描述】:

我已经设置了一个 twisted + flask https 服务器,它还按照 Twisted 站点 here 上的文档进行基于证书的客户端身份验证。到目前为止,一切顺利。

除了使用证书对客户端进行身份验证外,flask 应用程序中的应用程序代码还需要用户名(存在于客户端 x509 证书中)才能完成其工作。我找不到访问此信息的简单方法。信息(基于文档)在进行身份验证时似乎在 pyopenssl X509Name 对象中,每次处理来自该客户端的请求时,我都需要烧瓶层的身份。

flask 获取的请求对象似乎没有此信息(除非我读错了),所以我假设我需要在 Twisted 级别修改一些选项以将它们发送到 flask。我还需要以某种方式让它们脱离 OpenSSL 层。

你会怎么做?

【问题讨论】:

    标签: python flask openssl twisted


    【解决方案1】:

    更新:使用HTTPChannel.allHeadersReceived 代替Protocol.dataReceived 来支持分块请求。

    您可以使用 HTTP 标头来存储连接信息:在 HTTPChannel.allHeadersReceived 方法中设置它们并从 flask.request.headers 中检索,例如:

    from twisted.application import internet, service
    from twisted.internet import reactor
    from twisted.web.http import HTTPChannel
    from twisted.web.server import Site
    from twisted.web.wsgi import WSGIResource
    
    from flask import Flask, request
    
    app = Flask('app')
    
    @app.route('/')
    def index():
      return 'User ID: %s' % request.headers['X-User-Id']
    
    class MyHTTPChannel(HTTPChannel):
      def allHeadersReceived(self):
        user_id = 'my_user_id'
        req = self.requests[-1]
        req.requestHeaders.addRawHeader('X-User-Id', user_id)
        HTTPChannel.allHeadersReceived(self)
    
    class MySite(Site):
      protocol = MyHTTPChannel
    
    application = service.Application('myapplication')
    service = service.IServiceCollection(application)
    
    http_resource = WSGIResource(reactor, reactor.getThreadPool(), app)
    http_site = MySite(http_resource)
    internet.TCPServer(8008, http_site).setServiceParent(service)
    

    我不熟悉在twisted 中使用客户端证书。我假设您可以在Protocol.transport 中检索它的信息。

    【讨论】:

    • 感谢您的帮助。我担心这个 data_received 实现假设我们没有将单个请求拆分为多个 data_received 调用。这是一个有效的假设吗?
    • @orm 是的,你说得对,我没想到。更正确的方法是覆盖HTTPChannel.allHeadersReceived。我更新了我的代码示例。
    猜你喜欢
    • 2019-06-04
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多