【问题标题】:twisted over https扭曲了https
【发布时间】:2011-03-06 12:41:51
【问题描述】:

您好,我有一个使用 twisted 运行的应用程序。我希望它通过 https 而不是 http 运行。我在哪里可以找到一个很好的例子?

【问题讨论】:

    标签: https twisted


    【解决方案1】:

    您需要做的就是使用reactor.listenSSL 而不是reactor.listenTCP。 http://twistedmatrix.com/documents/current/core/howto/ssl.html 涵盖了reactor.listenSSL 的基础知识。

    【讨论】:

      【解决方案2】:

      HTTPS 是基于 SSL 的 HTTP。 HTTPS = HTTP + SSL/TLS。见文档http://twistedmatrix.com/documents/13.0.0/core/howto/ssl.html#auto1和http://twistedmatrix.com/documents/13.0.0/web/howto/using-twistedweb.html#auto2

      这是一个简单的例子:

      from twisted.internet import reactor, ssl
      from twisted.web import server, resource
      
      sslContext = ssl.DefaultOpenSSLContextFactory(
          '/Users/wucao/Desktop/https/2_gw2.vsgames.cn.key',  # Private Key
          '/Users/wucao/Desktop/https/1_gw2.vsgames.cn_bundle.crt',  # Certificate
      )
      
      class MainResource(resource.Resource):
      
          isLeaf = True
      
          def render_GET(self, request):
              request.responseHeaders.addRawHeader("Content-Type", "text/html; charset=utf-8")
              return "<html><body>Hello World</body></html>"
      
      
      site = server.Site(MainResource())
      reactor.listenSSL(443, site, sslContext)
      reactor.run()
      

      【讨论】:

        【解决方案3】:

        下面是一个在 SSL 上运行并带有基本身份验证的扭曲服务器示例:

        #!/usr/bin/env python
        
        USERS={'admin': 'admin', 
                'user': 'user',
                'test': 'eW91IGFyZSBjcmF6eQo='}
        
        """
        Twisted SSL webserver with basic authentication using plain in-memory passwords. 
        The first argument is the path of the directory to serve; if not provided then the current folder is used (".").
        
        INSTALL DEPENDENCIES:
            pip install twisted pyOpenSSL service_identity
        
        GENERATE SSL CERTIFICATES:
            mkdir ~/.ssl && cd ~/.ssl
            openssl genrsa > privkey.pem
            openssl req -new -x509 -key privkey.pem -out cacert.pem -days 9999
        
        USAGE:
            Requires running as root (normal users cannot bind to ports below 1024); 
            login with test_user/test_password
        
            sudo python twisted-web-ssl.py     # serve the current folder
            sudo python twisted-web-ssl.py /home
        """
        import os
        import sys
        
        from twisted.web.static import File
        from zope.interface import implements
        from twisted.python import log
        from twisted.internet import reactor, ssl
        from twisted.web import server, resource, guard
        from twisted.cred.portal import IRealm, Portal
        from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
        from twisted.python.log import startLogging
        
        startLogging(sys.stdout)
        home_dir = os.path.expanduser("~")
        
        sslContext = ssl.DefaultOpenSSLContextFactory(
            os.path.join(home_dir, '.ssl/privkey.pem'),
            os.path.join(home_dir, '.ssl/cacert.pem'),
        )
        
        class SimpleRealm(object):
            implements(IRealm)
        
            def __init__(self, path):
                self.path = path
        
            def requestAvatar(self, avatarId, mind, *interfaces):
        
                if resource.IResource in interfaces:
                    return resource.IResource, File(self.path), lambda: None
        
                raise NotImplementedError()
        
        
        def main(root):
            log.startLogging(sys.stdout)
            # alternative credential storage implementations: https://twistedmatrix.com/documents/current/api/twisted.cred.checkers.ICredentialsChecker.html
            checkers = [InMemoryUsernamePasswordDatabaseDontUse(**USERS)]
        
            wrapper = guard.HTTPAuthSessionWrapper(
                Portal(SimpleRealm(root), checkers),
                [guard.DigestCredentialFactory('md5', 'whatever.com')])
        
            reactor.listenSSL(443, server.Site(resource=wrapper),
                              contextFactory=sslContext)
            reactor.run()
        
        
        if __name__ == '__main__':
            root = sys.argv[1] if len(sys.argv) > 1  else '.'
            main(root)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          相关资源
          最近更新 更多