繁体   English   中英

SNMP4J 客户端给出“不支持的安全级别”

[英]SNMP4J Client gives "Unsupported security level"

我即将实施客户端/代理设置以学习使用 SNMP。 我想使用 SNMPv3 和authPriv作为安全级别来建立安全和加密的通信。
这是我的设置:

代理人
代理在 Ubuntu 上运行(在 Docker 映像中)。 为了进行设置,我遵循了本教程
我的/etc/snmp/snmpd.conf看起来像这样:

agentAddress udp:161
...
createUser authOnlyUser MD5 "test1234"
createUser authPrivUser SHA "test1234" DES
createUser internalUser MD5 "test1234"
...
rouser authOnlyUser
rwuser authPrivUser authPriv

SNMP 在端口161上运行,该端口由 Docker 转发到端口1025

客户
我可以确保我的代理正常工作使用

  1. snmpget在同一台机器上(Ubuntu,在 Docker 中):
    snmpget -v3 -a SHA -A test1234 -X test1234 -l authPriv -u authPrivUser localhost 1.3.6.1.2.1.1.1.0
  2. 来自远程机器 (Debian) 的snmpget
    snmpget -v3 -u authPrivUser -X test1234 -A test1234 -l authPriv -x DES -a SHA <HOST-IP>:1025 1.3.6.1.2.1.1.1.0
  3. 使用SNMP 测试器

在所有三种情况下,我都得到了给定 OID 的预期值:
Linux 9b98a8808b1a 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64

现在我想用 Java 实现一个客户端,使用snmp4j最新版本 3.2.2 这是我已经实施的:

public class SNMPTestClient {

    public static void main(String[] args) throws Exception {
        // enable logging
        ConsoleLogFactory consoleLogFactory = new ConsoleLogFactory();
        consoleLogFactory.getRootLogger().setLogLevel(LogLevel.DEBUG);
        LogFactory.setLogFactory(consoleLogFactory);

        TransportMapping<? extends Address> transport = new DefaultUdpTransportMapping();
        Snmp snmp = new Snmp(transport);

        // create and add user security model
        OctetString localEngineId = new OctetString(MPv3.createLocalEngineID());
        USM usm = new USM(SecurityProtocols.getInstance(), localEngineId, 0);
        SecurityModels.getInstance().addSecurityModel(usm);

        // user credentials
        OctetString securityName = new OctetString("authPrivUser");
        OctetString authPassphrase = new OctetString("test1234");
        OctetString privPassphrase = new OctetString("test1234");
        OID authProtocol = AuthSHA.ID;
        OID privProtocol = PrivDES.ID;

        UsmUser usmUser = new UsmUser(securityName, authProtocol, authPassphrase, privProtocol, privPassphrase);
        snmp.getUSM().addUser(securityName, usmUser);

        // create target
        UserTarget target = new UserTarget();
        target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
        target.setSecurityName(securityName);
        target.setAddress(GenericAddress.parse("udp:127.0.0.1/1025"));
        target.setVersion(SnmpConstants.version3);
        target.setRetries(3);
        target.setTimeout(10000);

        transport.listen();

        ScopedPDU pdu = new ScopedPDU();
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.1.0")));
        pdu.setType(PDU.GET);
        ResponseEvent event = snmp.send(pdu, target);
        if (event != null) {
            System.out.println(event.getUserObject());
            System.out.println(event.getError());
            System.out.println(event.getPeerAddress());
            PDU responsePDU = event.getResponse();
            System.out.println(responsePDU.getErrorStatus());
            System.out.println(responsePDU.getErrorIndex());
            if (responsePDU.getErrorStatus() == PDU.noError) {
                for (int k = 0; k < responsePDU.size(); k++) {
                    VariableBinding vb = responsePDU.get(k);
                    if (vb != null) {
                        System.out.println(vb.getOid() + "-" + vb.getVariable().toString());
                    }
                }
            } else {
                System.out.println("SNMP Error:" + responsePDU.getErrorStatusText());
            }
        } else {
            System.out.println("SNMP send unsuccessful.");
        }
    }
}

如您所见,我使用了与上述相同的凭据和协议。 但是当我运行它时,我收到以下异常:
org.snmp4j.MessageException: Message processing model 3 returned error: Unsupported security level

我在这里做错了什么? 由于用户authPrivUser被配置为在代理端使用authPriv安全级别,并且我还在客户端中将级别设置为AUTH_PRIV并传递正确的凭据,我不知道为什么会抛出此异常。

在此先感谢您的任何支持和提示!

编辑
我发现我上面发布的代码使用 SNMP4J v2.7.0确实有效。 任何版本 >=3.0.0 都会抛出错误Unsupported security level 不幸的是,使用 2018 年 11 月的旧版本不能成为解决方案......

在 SNMP4J 3.x 中,安全协议AuthSHA (和AuthMD5 )不再默认添加到静态SecurityProtocols实例,因为它们现在被认为是不安全的。

您可以通过调用再次添加它:

SecurityProtocols.addAuthenticationProtocol(new AuthSHA());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM