基于 asyncore 的 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()

最佳答案

我遵循了我认为使异步客户端工作的所有步骤 tlslite 文档——我实际上无法让它工作,因为我手头唯一可以调整的异步客户端是 Python 中的示例docs,这是一个 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 给你...)。

关于python - 如何将 TLS 与 asyncore 结合使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1085050/

10-11 20:20