2009-07-05 15 views
4

asyncore 기반 XMPP 클라이언트가 XMPP 서버에 대한 일반 TCP 연결을 엽니 다. 서버는 암호화 된 연결이 필요함을 나타냅니다. 이제 클라이언트는 TLS 핸드 셰이크를 시작하여 후속 요청을 암호화 할 수 있습니다.TLS를 asyncore와 함께 사용하려면 어떻게해야합니까?

tlslite은 asyncore와 통합되지만 샘플 코드는 서버 (?)를위한 것이므로 무엇을하는지 이해할 수 없습니다.

저는 파이썬 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() 

답변

2

나는 내가 asyncore 클라이언트 작업을 할 문서 tlslite 모든 단계가 믿는 것을 따랐습니다 - 나는 실제로 그것을 얻을 수 없다 유일한 비동기 클라이언트가 HTTP 1.0 클라이언트 인 Python 문서의 예입니다.이 때문에 HTTPS 연결을 설정하려고합니다. 매우 반 - 구운 방법. 또한 asyncore XMPP 클라이언트 나 TLS를 요청하는 XMPP 서버가 없기 때문에 상황에 가까운 곳으로 가야합니다. 그럼에도 불구하고 (비록 어떤 단계가 빠졌을지라도) 이전에했던 것보다 조금 나아진 것 같습니다. - 생각합니다. 나는 모든 필요한 단계를 보여주고 있습니다. __init__. BTW, 나는 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() 

파이썬 문서에서 asyncore 예 HTTP 클라이언트의 혼합이다, 게다가 나는 tlslite 워드 프로세서에서 수집 한 자신의 소스에서 리버스 엔지니어링 할 수 있었다 것. 이 (심지어 불완전한/작동하지 않지만) 적어도 당신의 탐구에 당신을 발전시킬 수 있기를 바랍니다 ...

개인적으로, 신발에서, 나는 asyncore에서 twisted으로 전환하는 것을 고려할 것입니다 - asyncore는 오래되고 녹슬었고, (내가 준 URL은 이미 TLS와 XMPP를 통합 한 문서에서 약간의 것이지만 ...).

+0

감사합니다. 매우 도움이되었습니다. 그것은 The TLSAsyncDispatcherMixIn을 좀 더 자세하게 살펴볼 것을 권했고, 제 목적을위한 붉은 청어 였고 2 줄의 간단한 선으로 작업하는 TLS 마법을 얻을 수있었습니다. asyncore가 "오래되고 녹슬 었음"과 관련된 댓글을 작성하거나 링크를 제공 할 수 있습니까? – Bill

+2

그물에 대한 많은 토론. koichitamura.blogspot.com/2008/04/.... Twisted는 활발한 개발과 연마의 보석 인 반면, 아무도 실질적으로 수년간 asyncore를 향상시키지 못했습니다. BTW, 질문을 편집하여 끝에 "2 개의 간단한 라인"을 추가하면 다른 사람들이 나중에 도움이 될 수 있습니까? 감사! –

+0

+1 asyncore를 버려야합니다! –

4

트위스트 및 k켈을 꼭 확인하십시오. 나는 그걸로 xmpp 봇과 구성 요소의 톤을 구축 해왔고 그것은 꿈이다.

관련 문제