【问题标题】:How do I use TLS with asyncore?如何将 TLS 与 asyncore 一起使用?
【发布时间】:2009-07-05 23:23:06
【问题描述】:

基于异步的 XMPP 客户端打开到 XMPP 服务器的正常 TCP 连接。服务器指示它需要加密连接。客户端现在应该启动 TLS 握手,以便可以加密后续请求。

tlslite 与 asyncore 集成,但示例代码用于服务器(?),我不明白它在做什么。

我使用的是 Python 2.5。如何让 TLS 魔法发挥作用?


这就是最终对我有用的东西:

from tlslite.api import *

def handshakeTls(self):
    """
    Encrypt the socket using the tlslite module
    """
    self.logger.info("activating TLS encrpytion")
    self.socket = TLSConnection(self.socket)
    self.socket.handshakeClientCert()

【问题讨论】:

    标签: python ssl


    【解决方案1】:

    一定要看看twisted 和wokkel。我一直在用它构建大量的 xmpp 机器人和组件,这是一个梦想。

    【讨论】:

      【解决方案2】:

      我已经按照我认为的所有步骤 tlslite 文档来使异步客户端工作——我实际上无法让它工作,因为我手头上唯一为此目的调整的异步客户端是示例在 Python 文档中,它是一个 HTTP 1.0 客户端,我相信正因为如此,我正试图以一种非常不成熟的方式建立一个 HTTPS 连接。而且我没有异步 XMPP 客户端,也没有任何请求 TLS 的 XMPP 服务器来接近您的情况。尽管如此,我还是决定分享我的工作成果,因为(即使可能缺少某些步骤)它似乎确实比你以前拥有的要好一些——我认为我正在展示所有__init__ 中的所需步骤。顺便说一句,我从 tlslite/test 目录中复制了 pem 文件。

      import asyncore, socket
      from tlslite.api import *
      
      s = open("./clientX509Cert.pem").read()
      x509 = X509()
      x509.parse(s)
      certChain = X509CertChain([x509])
      
      s = open("./clientX509Key.pem").read()
      privateKey = parsePEMKey(s, private=True)
      
      
      class http_client(TLSAsyncDispatcherMixIn, asyncore.dispatcher):
          ac_in_buffer_size = 16384
      
          def __init__(self, host, path):
              asyncore.dispatcher.__init__(self)
              self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
              self.connect( (host, 80) )
      
              TLSAsyncDispatcherMixIn.__init__(self, self.socket)
              self.tlsConnection.ignoreAbruptClose = True
              handshaker = self.tlsConnection.handshakeClientCert(
                  certChain=certChain,
                  privateKey=privateKey,
                  async=True)
              self.setHandshakeOp(handshaker)
      
              self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
      
          def handle_connect(self):
              pass
      
          def handle_close(self):
              self.close()
      
          def handle_read(self):
              print self.recv(8192)
      
          def writable(self):
              return (len(self.buffer) > 0)
      
          def handle_write(self):
              sent = self.send(self.buffer)
              self.buffer = self.buffer[sent:]
      
      c = http_client('www.readyhosting.com', '/')
      
      asyncore.loop()
      

      这是 Python 文档中的 asyncore 示例 http 客户端的组合,以及我从 tlslite 文档中收集到的内容,并且能够从其源代码进行逆向工程。希望这(即使不完整/不工作)至少可以推动你的追求......

      就您个人而言,我会考虑从 asyncore 切换到 twisted -- asyncore 陈旧而生锈,Twisted 已经集成了许多有趣、有用的部分(我给出的 URL 是文档中的一些已经为您集成了 TLS 和 XMPP...)。

      【讨论】:

      • 谢谢,这很有帮助。它鼓励我更详细地查看 TLSAsyncDispatcherMixIn,我最终了解到,对于我的目的来说,这是一个红鲱鱼,我可以使用 2 条简单的行来获得 TLS 魔法。您能否详细说明或提供有关 asyncore “老旧生锈”的评论的链接?
      • 网上很多讨论,例如koichitamura.blogspot.com/2008/04/…。多年来没有人大幅增强 asyncore,而 twisted 是积极开发和完善的宝石。顺便说一句,您可以编辑您的问题以在其末尾添加那些“2 条简单的行”,以便其他人将来可以受益吗?谢谢!
      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2017-07-14
      • 2018-08-28
      • 2019-05-26
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多