2017-01-24 1 views
0

J'utilise SNMP4J (version 2.5.3) pour lancer des requêtes SNMP sur une cible configurée dans SNMP V3. Cela fonctionne bien pour toutes les combinaisons de protocoles auth/priv sauf pour le protocole de confidentialité AES 256! Je peux seulement obtenir une réponse nulle.SNMP4J - impossible de le faire fonctionner pour SNMP V3 avec SHA/AES 256

Voici le code:

public static void main(String[] args) throws Exception 
{ 
    String targetAddress = "udp:10.2.1.41/161"; 
    String userName = "mip_aes256"; 
    OID authProtocol = AuthSHA.ID; 
    String authPassphrase = "mip_user_AuthPassword"; 
    OID privProtocol = PrivAES256.ID; 
    String privPassphrase = "mip_user_PrivPassword"; 

    // build a PDU with all the OIDs 
    ScopedPDU requestPDU = new ScopedPDU(); 
    requestPDU.add(new VariableBinding(new OID("1.3.6.1.2.1.1.1.0"))); 
    requestPDU.setType(PDU.GET); 

    UserTarget target = new UserTarget(); 
    target.setTimeout(5000); 
    target.setVersion(SnmpConstants.version3); 
    target.setAddress(GenericAddress.parse(targetAddress)); 
    target.setSecurityLevel(SecurityLevel.AUTH_PRIV); 
    target.setSecurityName(new OctetString(userName)); 

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

    // add user to the USM 
    snmp.getUSM().addUser(new OctetString(userName), 
      new UsmUser(new OctetString(userName), 
        authProtocol, 
        new OctetString(authPassphrase), 
        privProtocol, 
        new OctetString(privPassphrase))); 

    transport.listen(); 

    ResponseEvent re = snmp.send(requestPDU, target); 
    PDU responsePDU = re.getResponse(); 
    if (responsePDU == null) 
    { 
     System.out.println("responsePDU == null :"); 
     System.out.println("> Error  : " + re.getError()); 
     System.out.println("> Address  : " + re.getPeerAddress()); 
     System.out.println("> Source  : " + re.getSource()); 
     System.out.println("> User object : " + re.getUserObject()); 
    } 
    else if (responsePDU.getVariableBindings() != null) 
    { 
     for (VariableBinding vb : responsePDU.getVariableBindings()) 
     { 
      System.out.println(vb.getOid() + " --> " + vb.getVariable()); 
     } 
    } 
} 

Je suis assez sûr que la configuration du routeur est très bien (config fournisseur réseau sur le routeur Cisco). Mon installation de Java 8 (sur Ubuntu 64) inclut l'extension Java Cryptography pour une force illimitée. Avez-vous une idée de ce problème?

Merci pour votre aide,

Cordialement Sylvain

Répondre

1

SNMPv3 AES 256 est non standard. Un google pour snmpv3 aes 256 détaillera cela. Selon notre expérience, toutes les implémentations ne fonctionneront pas ensemble. C'est ce que la normalisation est pour.

+0

merci pour votre réponse. Ok, je comprends AES 256 est non standard mais si SNMP4J le supporte, qu'est-ce que cela signifie? Supportera-t-il seulement quelques implémentations? Laquelle ? – mnementh64

+0

Ils ont implémenté QUELQUE CHOSE. Quelqu'un d'autre (le fournisseur de votre appareil) a implémenté SOMETHING else. Comme il n'est pas standard, il n'est pas passé par le processus rigoureux pour s'assurer que tout le monde est d'accord sur ce qu'est quelque chose. –

+0

Il est donc très difficile d'implémenter un tel appelant SNMP. Je dois considérer un code dédié à chaque appareil? Et d'abord, je dois obtenir les paramètres de mise en œuvre du fournisseur de l'appareil. Comment trouver ça ?? Comment une entreprise pourrait-elle annoncer un support AES 256 de son produit? – mnementh64

1

J'ai trouvé un changement pour le faire fonctionner pour un Cisco 2900.

OID privProtocol = PrivAES256With3DESKeyExtension.ID; 
SecurityProtocols.getInstance().addPrivacyProtocol(new PrivAES256With3DESKeyExtension()); 

J'espère que cela pourrait aider quelqu'un!