2014-10-01 2 views
1

Jean-Paul Calderone의 조언에 이어 여기에 ssl.ClientCertificateOptions 사용을 지원하도록 뒤틀린 "starttls_server"샘플을 수정하려고합니다. http://twistedmatrix.com/documents/14.0.0/api/twisted.internet.ssl.CertificateOptions.htmlTwisted Python, 일반 텍스트에서 보안 연결로 전환 할 때 ssl.CertificateOptions 사용

from twisted.internet import ssl, protocol, defer, task, endpoints 
from twisted.protocols.basic import LineReceiver 
from twisted.python.modules import getModule 

class TLSServer(LineReceiver): 
    def lineReceived(self, line): 
     print("received: " + line) 
     if line == "STARTTLS": 
      print("-- Switching to TLS") 
      self.sendLine('READY') 
      self.transport.startTLS(self.factory.options) 

def main(reactor): 
    certData = getModule(__name__).filePath.sibling('server.pem').getContent() 
    cert = ssl.PrivateCertificate.loadPEM(certData) 
    factory = protocol.Factory.forProtocol(TLSServer) 
    factory.options = cert.options() 
    endpoint = endpoints.TCP4ServerEndpoint(reactor, 8000) 
    endpoint.listen(factory) 
    return defer.Deferred() 

if __name__ == '__main__': 
    import starttls_server 
    task.react(starttls_server.main) 

당 내 이해가 해당 파일을 읽은 나는 효과적으로 certopts = ssl.CertificateOptions(privateKey=pKeyData, certificate=certData, trustRoot=caCertsData) (같은 것을 함께 cert = ssl.PrivateCertificate...cert.options = ssl.PrivateCertificate.... 라인을 교체해야한다는 것입니다으로, 내 개인 키, 인증서 및 신뢰할 수있는 루트를 지정할 수 있도록 in certData, caCertsData 및 pKeyData)를 입력 한 다음 factory.options에 전달 - pasti는 제외 내가 시도한 코드의 모든 변종에 대해서는 아직 제대로 이해하지 못했다. 내 노력으로 고전적인 "OpenSSL.crypto.Error : []"의 다양한 결과가 생겼다. PEM 파일을 화면에 표시하고 종료합니다!

누구든지 나를 계몽시킬 수 있습니까? 고마워요.

답변

1

cert.options()은 이미 CertificateOptions입니다. 문제는 options이 위치 인수로 Certificate과 같은 권한을 가지며 다른 모든 구성 값을 통과시키지 않으므로 CertificateOptions을 직접 구성하려고합니다.

factory.options = cert.options() 줄을 factory.options = ssl.CertificateOptions(...)으로 변경하십시오.

그러나 CertificateOptions은 키 데이터가 아닌 privateKey으로 pyOpenSSL PKey 개체를 사용합니다. 따라서 OpenSSL API를 사용하여 해당 키를로드해야하거나 PrivateCertificate에서 추출 할 수 있습니다.

If you read the signature of CertificateOptions very carefully, 필요한 유형은 상당히 명확해야합니다. 또한 pyOpenSSL 설명서를 참조해야 할 수도 있습니다.

+1

안녕하세요 @ 글리프, 다시 한 번 고맙습니다. 그래서 내 서버가'factory.options = ssl.CertificateOptions (privateKey = pKeyData, certificate = certData, trustRoot = caCert)'로 실행되고있다. 그러나 exceptions.TypeError : cert가있는 서버 오류는 X509 인스턴스 여야합니다. - 클라이언트가 cert의 pem 복사본을 제공합니다. 여기에 내게 계몽 할 수 있습니까? 아니면 새로운 질문으로 제기하는 것이 더 의미가 있습니까? ! –

+2

인증서를 'CertificateOptions'에 pyOpenSSL X509 인스턴스로 전달하는지 확인하십시오. Twisted의'PrivateCertificate '유형이 아닙니다. –

+1

안녕하세요 @ Jean-PaulCalderone ... filePath.sibling을 사용하여 파일에서 3 개의 매개 변수를 읽습니다. ('xxxxx'). getContent(). caCert는 'BEGIN CERTIFICATE [데이터] END CERTIFICATE'가있는 PEM이며 certData는 동일하지만'RSA 프라이 머리 키 [데이터] END RSA 프라이 머리 키 '와 동일합니다. (예상했던대로) 다른 것입니다.'Private-Key (1024 비트)/모듈/[16 진수 stuff]/publicExponent : 65537 (.... 등)'. 이게 맞지 않아? 나는이 세 가지 매개 변수에 대한 [비공개] 인증서를 전혀 사용하지 않습니다. –