基于 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/