【问题标题】:Twisted SMTP server, adding SSL support, 2 factories?扭曲的 SMTP 服务器,添加 SSL 支持,2 个工厂?
【发布时间】:2014-10-20 08:41:16
【问题描述】:

最近问过Twisted mail server with TLS - no portal? 看来我找错人了 - 所以现在问一个新的、修改过的问题似乎是恰当和恰当的。

因此,我正在尝试扩展位于http://twistedmatrix.com/documents/current/_downloads/emailserver.tac 的基本 SMTP 服务器示例以支持 SSL 连接。我可以按如下方式创建一个 ssl 上下文工厂(代码取自我之前的工作:

caCertFile = open("/opt/tesa/etc/certs/CA/cacert.pem","r")
certFile = open("/opt/tesa/etc/certs/server/server.crt","r")
keyFile = open("/opt/tesa/etc/certs/server/server.key","r")
caCertData = caCertFile.read()
pKeyData = keyFile.read()
certData = certFile.read()
caCert = ssl.Certificate.loadPEM(caCertData)
cert = load_certificate(FILETYPE_PEM, certData)
pKey = load_privatekey(FILETYPE_PEM, pKeyData)
sslCtxFactory = ssl.CertificateOptions(privateKey=pKey, certificate=cert, trustRoot=caCert)

所以现在我有了来自 emailserver.tac 的 SMTP 工厂,以及上面的 sslCtxFactory。在我的旧代码中,我创建了一个 ESMTP 类的对象,如下所示:

myESMTP = ESMTP(contextFactory=sslCtxFactory)
factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory))
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8001)
endpoint.listen(factory)

但由于此代码未使用门户等,因此 ESMTP 类定义中的某些方法/函数由于未定义各种属性(例如 self.delivery、self.portal)而失败。

所以我试图了解如何在 mailserver.tac 代码中实现我的 sslCtxFactory - 同时仍然按照 mailserver.tac 使用门户/领域,以确保扭曲的 ESMTP 类中的方法不会失败。

但是我怎样才能把这两个工厂“放在一起”呢?

谢谢

【问题讨论】:

    标签: ssl smtp twisted factory


    【解决方案1】:

    这看起来很奇怪:

    myESMTP = ESMTP(contextFactory=sslCtxFactory)
    factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory))
    

    Twisted 提供的ESMTP 类的实例不可调用。我想你的意思一定是这样的:

    from functools import partial
    
    myESMTP = partial(ESMTP, contextFactory=sslCtxFactory)
    factory = protocol.Factory.forProtocol(mySMTP)
    

    假设...

    ESMTP 类尊重self.portal 属性的身份验证和授权行为。您需要做的就是设置它。

    SMTPFactorySMTP 实例的工厂,它将协议的 portal 属性设置为其自己的(工厂的)portal 属性的值。唯一的问题是它会生成 SMTP 实例而不是 ESMTP 实例。

    幸运的是,它(工厂)尊重其protocol 属性,以便类实例化。

    如果你要写:

    portal = Portal(...)
    myESMTP = partial(ESMTP, contextFactory=...)
    factory = SMTPFactory.forProtocol(protocol=myESMTP, portal=portal)
    

    那么您将拥有一个工厂:

    • 创建 ESMTP 实例
    • 在实例化时将contextFactory=... 传递给ESMTP 的初始化器
    • 在实例化ESMTP 实例后设置portal 属性,使用此处传递给forProtocol 的值。

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多