使用带有选项 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章

启用带有多个输入的选项卡并使用一个输入禁用选项卡

使用带有选项卡布局的自定义视图时无法从选项卡中删除填充

使用带有“远程”选项的 jQuery 验证插件

动态创建带有闪亮绘图的选项卡,而无需重新创建现有选项卡

使用带有新工具栏的选项卡 (AppCompat v7-21)

在带有选项卡的 Winforms 的模型视图演示器中应该使用多少个演示器?