Python 尝试/除非在证书/密钥不匹配的情况下不使用twisted starttls
所以我的twisted邮件接收器工作得很好。直到我们尝试处理配置被禁用的情况,一个不匹配的证书/密钥被传递到工厂的证书选项对象 我有一个模块,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
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()
的意思是“将回溯转储到日志”: