使用带有选项 privProtocol=usm3DESEDEPrivProtocol 的 pysnmp 时出错
Posted
技术标签:
【中文标题】使用带有选项 privProtocol=usm3DESEDEPrivProtocol 的 pysnmp 时出错【英文标题】:error while using pysnmp with the option privProtocol=usm3DESEDEPrivProtocol 【发布时间】:2018-06-09 20:20:24 【问题描述】:我想从一个配置了 auth 协议 MD5 和 priv 协议 3DES 的 snmp 设备获取信息。
配置语句为 snmp-server 用户 testuser testgroup v3 auth md5 authmd5pwd priv 3des privpwddes
访问设备的pysnmp代码是
from pysnmp.hlapi import *
def get(mib):
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
UsmUserData('nmsuser', 'authmd5pwd', 'privpwddes',
authProtocol=usmHMACMD5AuthProtocol,
privProtocol=usm3DESEDEPrivProtocol),
UdpTransportTarget(('10.96.158.251', 161)),
ContextData(),
ObjectType(ObjectIdentity(mib)))
)
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
print(varBind[1])
if __name__ == "__main__":
get('.1.3.6.1.2.1.1.5.0')
当我执行这个时,我得到
回溯(最近一次通话最后): 文件“pytest.py”,第 24 行,在 得到('.1.3.6.1.2.1.1.5.0') 文件“pytest.py”,第 11 行,在 get 对象类型(对象身份(mib))) 文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/hlapi/asyncore/sync/cmdgen.py”,第 113 行,在 getCmd 文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/carrier/asyncore/dispatch.py”,第 50 行,在 runDispatcher pysnmp.error.PySnmpError:轮询错误:回溯(最近一次调用最后一次): ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/carrier/asyncore/dispatch.py”,第 46 行,在 runDispatcher use_poll=True, map=self.__sockMap, count=1) ;文件“/usr/lib/python2.7/asyncore.py”,第 220 行,在循环中 poll_fun(超时,地图) ; poll2 中的文件“/usr/lib/python2.7/asyncore.py”,第 201 行 读写(obj,标志) ;文件“/usr/lib/python2.7/asyncore.py”,第 123 行,读写 obj.handle_error() ;文件“/usr/lib/python2.7/asyncore.py”,第 108 行,读写 obj.handle_read_event() ;文件“/usr/lib/python2.7/asyncore.py”,第 449 行,在 handle_read_event 中 self.handle_read() ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/carrier/asyncore/dgram/base.py”,第 163 行,在 handle_read self._cbFun(自我,transportAddress,incomingMessage) ; _cbFun 中的文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/carrier/base.py”,第 70 行 自我,transportDomain,transportAddress,incomingMessage ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/entity/engine.py”,第 152 行,在 __receiveMessageCbFun 自我,transportDomain,transportAddress,wholeMsg ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/rfc3412.py”,第 344 行,在 receiveMessage 状态信息 ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/rfc3412.py”,第 533 行,在 __expireRequest 缓存参数['cbCtx']) ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/entity/rfc3413/cmdgen.py”,第 104 行,在 processResponsePdu (origSendRequestHandle, cbFun, cbCtx)) ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/rfc3412.py”,第 153 行,在 sendPdu pduVersion、PDU、expectResponse、sendPduHandle ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/mpmod/rfc3412.py”,第 240 行,在 prepareOutgoingMessage securityEngineId、securityName、securityLevel、scopedPDU ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/secmod/rfc3414/service.py”,第 525 行,在 generateRequestMsg 没有) ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/secmod/rfc3414/service.py”,第 395 行,在 __generateRequestOrResponseMsg (snmpEngineBoots,snmpEngineTime,无),dataToEncrypt ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/secmod/eso/priv/des3.py”,第 117 行,在 encryptData encryptKey、snmpEngineBoots ;文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/secmod/eso/priv/des3.py”,第 77 行,在 __getEncryptionKey preIV = privKey[24:32] ;文件“/usr/local/lib/python2.7/dist-packages/pyasn1/type/univ.py”,第 996 行,在 __getitem__ 返回 self.clone(self._value[i]) ;克隆中的文件“/usr/local/lib/python2.7/dist-packages/pysnmp-4.4.3-py2.7.egg/pysnmp/proto/rfc1902.py”,第 202 行 返回 univ.OctetString.clone(self, *args, **kwargs).setFixedLength(self.getFixedLength()) ;文件“/usr/local/lib/python2.7/dist-packages/pyasn1/type/base.py”,第 349 行,在克隆中 return self.__class__(value, **initilaizers) ;文件“/usr/local/lib/python2.7/dist-packages/pyasn1/type/univ.py”,第 819 行,在 __init__ base.AbstractSimpleAsn1Item.__init__(self, value, **kwargs) ;文件“/usr/local/lib/python2.7/dist-packages/pyasn1/type/base.py”,第 246 行,在 __init__ raise exType('%s at %s' % (exValue, self.__class__.__name__)) ;ValueConstraintError: , > 失败于:ValueConstraintError("失败于:ValueConstraintError('',)",) 在 OctetString【问题讨论】:
【参考方案1】:在 pysnmp 4.4.3 中使用 3DES 和短哈希 HMAC(例如 MD5)时似乎是一个错误。
您可以使用其他产生至少 32 字节长哈希的 AUTH 算法,或者从其master branch 中提取固定的 pysnmp (4.4.4)。
更改用户名/密码后,您的脚本似乎可以与 simulator 一起使用。
【讨论】:
非常感谢。随着修复它的工作正常。 pysnmp (4.4.4) 什么时候发布?以上是关于使用带有选项 privProtocol=usm3DESEDEPrivProtocol 的 pysnmp 时出错的主要内容,如果未能解决你的问题,请参考以下文章