基于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()
答案 0 :(得分:4)
绝对检查扭曲和wokkel。我用它制作了大量的xmpp机器人和组件,这是一个梦想。
答案 1 :(得分:2)
我已经遵循了我认为的所有步骤tlslite文档,以使异步客户端工作 - 我实际上无法让它工作,因为我唯一的asyncore客户端我手头调整的目的是示例在Python文档中,这是一个HTTP 1.0客户端,我相信由于这个原因,我试图以非常不成熟的方式建立HTTPS连接。我没有asyncore XMPP客户端,也没有任何XMPP服务器请求TLS,以便能够接近您的情况。尽管如此,我还是决定分享我的工作成果,因为(尽管可能会缺少一些步骤)它似乎比你以前的好一点 - 我想我正在展示所有__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的文档......)。