1

SNMP4Jを使用して作成されたトラップ送信者で、privProtocol 3DES、AES192、およびAES256の V3 トラップ送信が失敗しました。発生した例外を以下に示します。

org.snmp4j.MessageException: Message processing model 3 returned error: Unsupported security level
at org.snmp4j.MessageDispatcherImpl.sendPdu(MessageDispatcherImpl.java:501)
at org.snmp4j.Snmp.sendMessage(Snmp.java:1005)
at org.snmp4j.Snmp.send(Snmp.java:885)
at org.snmp4j.Snmp.send(Snmp.java:878)
at org.snmp4j.Snmp.send(Snmp.java:843)

同じコードは、privProtocol DES と AES128、およびすべての authProtocol でうまく機能します。

コードを以下に示します。

    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
                MPv3.createLocalEngineID()),0);
        SecurityModels.getInstance().addSecurityModel(usm);
        Snmp snmp = new Snmp(transport);

        //Creating USM user according to Security level

        //Security Level: noAuthNoPriv
        if(trapDetails.getSecurityLevel()==1){
            snmp.getUSM().addUser(
                    new OctetString(trapDetails.getUserName()),
                    new UsmUser(new OctetString(trapDetails.getUserName()), null, null,
                            null,null));
            }

        //Security Level:AuthNoPriv
        if(trapDetails.getSecurityLevel()==2){
            snmp.getUSM().addUser(
                    new OctetString(trapDetails.getUserName()),
                    new UsmUser(new OctetString(trapDetails.getUserName()), new OID(
                            trapDetails.getAuthProtocol()), new OctetString(trapDetails.getAuthPassword()),
                            null,null));
            }

        //Security Level:AuthPriv
        if(trapDetails.getSecurityLevel()==3){
        snmp.getUSM().addUser(
                new OctetString(trapDetails.getUserName()),
                new UsmUser(new OctetString(trapDetails.getUserName()), new OID(
                        trapDetails.getAuthProtocol()), new OctetString(trapDetails.getAuthPassword()),
                        new OID (trapDetails.getPrivProtocol()),new OctetString(trapDetails.getPrivPassword())));
        }

.........

//Creating PDU

        ScopedPDU pdu= new ScopedPDU();
        pdu.setType(PDU.NOTIFICATION);
        pdu.setRequestID(new Integer32(200));
        pdu.setErrorIndex(0);
        pdu.setErrorStatus(SnmpConstants.SNMP_ERROR_BAD_VALUE);
        pdu.add(new VariableBinding(SnmpConstants.sysUpTime,new TimeTicks(255)));
        pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID(trapDetails
                .getTrapOID())));
        pdu.add(new VariableBinding(SnmpConstants.snmpTrapEnterprise,new OID(SnmpConstants.snmpTrapEnterprise)));



//Creating target to send trap

        UserTarget uTarget= new UserTarget();
        ArrayList<String> destinationList = new ArrayList<String>(trapDetails.getDestinationIP());
        Iterator<String> itr= destinationList.iterator();
        String element;
        while(itr.hasNext()){
        uTarget = new UserTarget();
        element= itr.next().toString();
        uTarget.setAddress(new UdpAddress(InetAddress.getByName(element),trapDetails.getPort()));
        uTarget.setRetries(2);
        uTarget.setTimeout(5000);
        uTarget.setVersion(SnmpConstants.version3);
        uTarget.setSecurityLevel(trapDetails.getSecurityLevel());
        uTarget.setSecurityName(new OctetString(trapDetails.getUserName()));
        snmp.send(pdu, uTarget);

        }
4

1 に答える 1

0

SecurityProtocols に PrivacyProtocols が追加されているかどうかを確認します。そうでない場合は、次のように追加できます

SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES());

また、128 ビットを超える暗号化を使用するには、SunJCE などの適切な JCE を使用していることを確認してください。http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.htmlを参照してください。

于 2014-11-04T23:50:19.823 に答える