Python 尝试/除非在证书/密钥不匹配的情况下不使用twisted starttls

Python 尝试/除非在证书/密钥不匹配的情况下不使用twisted starttls,python,exception,twisted,Python,Exception,Twisted,所以我的twisted邮件接收器工作得很好。直到我们尝试处理配置被禁用的情况,一个不匹配的证书/密钥被传递到工厂的证书选项对象 我有一个模块,custom\u esmtp.py,其中包含一个超负荷的ext\u starts(self,rest),我对其进行了如下修改,以包括一个try/except: elif self.ctx and self.canStartTLS: try: self.sendCode(220, 'Begin

所以我的twisted邮件接收器工作得很好。直到我们尝试处理配置被禁用的情况,一个不匹配的证书/密钥被传递到工厂的证书选项对象

我有一个模块,
custom\u esmtp.py
,其中包含一个超负荷的
ext\u starts(self,rest)
,我对其进行了如下修改,以包括一个try/except:

    elif self.ctx and self.canStartTLS:
            try:
                self.sendCode(220, 'Begin TLS negotiation now')
                self.transport.startTLS(self.ctx)
                self.startedTLS = True
            except:
                log.err()
                self.sendCode(550, "Internal server error")
                return
当我运行代码时,在传递了不匹配的证书和密钥后,我得到以下调用堆栈:

Unhandled Error
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/twisted/internet/tcp.py", line 220, in _dataReceived
    rval = self.protocol.dataReceived(data)
  File "/usr/local/lib/python2.7/site-packages/twisted/protocols/basic.py", line 454, in dataReceived
    self.lineReceived(line)
  File "/usr/local/lib/python2.7/site-packages/twisted/mail/smtp.py", line 568, in lineReceived
    return getattr(self, 'state_' + self.mode)(line)
  File "/usr/local/lib/python2.7/site-packages/twisted/mail/smtp.py", line 582, in state_COMMAND
    method('')
--- <exception caught here> ---
  File "custom_esmtp.py", line 286, in ext_STARTTLS
    self.transport.startTLS(self.ctx)
  File "/usr/local/lib/python2.7/site-packages/twisted/internet/_newtls.py", line 179, in startTLS
    startTLS(self, ctx, normal, FileDescriptor)
  File "/usr/local/lib/python2.7/site-packages/twisted/internet/_newtls.py", line 139, in startTLS
    tlsFactory = TLSMemoryBIOFactory(contextFactory, client, None)
  File "/usr/local/lib/python2.7/site-packages/twisted/protocols/tls.py", line 769, in __init__
    contextFactory = _ContextFactoryToConnectionFactory(contextFactory)
  File "/usr/local/lib/python2.7/site-packages/twisted/protocols/tls.py", line 648, in __init__
    oldStyleContextFactory.getContext()
  File "/usr/local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1429, in getContext
    self._context = self._makeContext()
  File "/usr/local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1439, in _makeContext
    ctx.use_privatekey(self.privateKey)
OpenSSL.SSL.Error: [('x509 certificate routines', 'X509_check_private_key', 'key values mismatch')]
未处理的错误
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python2.7/site packages/twisted/internet/tcp.py”,第220行,在收到的数据中
rval=self.protocol.dataReceived(数据)
dataReceived中的文件“/usr/local/lib/python2.7/site packages/twisted/protocols/basic.py”,第454行
self.lineReceived(行)
文件“/usr/local/lib/python2.7/site packages/twisted/mail/smtp.py”,第568行,在lineReceived中
return getattr(self,“state_'+self.mode)(行)
文件“/usr/local/lib/python2.7/site packages/twisted/mail/smtp.py”,第582行,在state_命令中
方法(“”)
---  ---
文件“custom_esmtp.py”,第286行,在ext_STARTTLS中
self.transport.startTLS(self.ctx)
文件“/usr/local/lib/python2.7/site packages/twisted/internet/_newtls.py”,第179行,在startTLS中
startTLS(self、ctx、normal、FileDescriptor)
文件“/usr/local/lib/python2.7/site packages/twisted/internet/_newtls.py”,第139行,在startTLS中
tlsFactory=TLSMemoryBIOFactory(contextFactory,客户端,无)
文件“/usr/local/lib/python2.7/site packages/twisted/protocols/tls.py”,第769行,在__
contextFactory=\u ContextFactoryToConnectionFactory(contextFactory)
文件“/usr/local/lib/python2.7/site packages/twisted/protocols/tls.py”,第648行,在__
oldStyleContextFactory.getContext()
getContext中的文件“/usr/local/lib/python2.7/site packages/twisted/internet/_sslverify.py”,第1429行
self.\u context=self.\u makeContext()
文件“/usr/local/lib/python2.7/site-packages/twisted/internet/_-sslverify.py”,第1439行,在_-makeContext中
ctx.使用私钥(self.privatekey)
OpenSSL.SSL.Error:[('x509证书例程','x509\u检查\u私钥','键值不匹配')]
custom_esmtp.py
的第286行是
self.transport.startTLS(self.ctx)
。我已经查看了堆栈中列出的所有twisted模块,在引用的行中,没有其他try/except块。。。。因此,我的理解是,应该将错误不经处理地传递回堆栈,直到它在
custom_esmtp.py
中到达我的处理程序?那么,为什么它没有得到处理呢?特别是因为我唯一的,除了,就是“一网打尽”


提前谢谢

如果希望捕获此错误,可以执行以下操作:

from OpenSSL import SSL

# ...

try:
    # ...
except SSL.Error:
    # ...

也许语法有点变化。我无法检查,因为我没有使用这个精确的包,但我的想法是,您必须声明要捕获的异常的导入路径。

但肯定的是,只有一个非特定的
,除了:
处理程序,这应该已经被发现了?@SteveHall我记得我曾经遇到过同样的问题,我必须指定自定义异常。也许
except
本身只处理内置的Python异常。我必须说我不知道这里的内部机制在起作用。谢谢@Jivan-我认为这很有帮助-我可以看到异常处理程序正在启动,但我仍然得到调用堆栈转储。。。奇怪的是,删除“
log.err()
解决了这个问题!现在看来一切都好了!谢谢大家!@史蒂文霍尔:谢谢你的跟进。确实很奇怪,
log.err()
改变了行为,有朝一日我必须检查一下以了解发生了什么。
log.err()
的意思是“将回溯转储到日志”: