2017-05-19 4 views
0

Je travaille sur un projet qui aimerait pouvoir utiliser des certificats ou des clés comme méthode d'authentification pour SNMPv3. Nous utilisons la bibliothèque Java SNMP4J.Comment utilisez-vous les clés asymétriques ou l'authentification par certificat dans SNMP4J?

Au cours de mes recherches, j'ai trouvé que SNMP utilise TLS/DTLS pour le cryptage des messages et soi-disant aussi pour l'authentification. Source 1 | Source 2 | En étudiant la petite documentation de SNMP4J, j'ai constaté qu'elle permettait l'utilisation de certificats TLS pour le chiffrement du trafic. Mais je ne suis pas sûr de savoir comment l'authentification est faite, si possible, en utilisant une paire de clés publique/privée. TLS Traffic Encryption Example | SNMP4J Documentation

Toute aide serait appréciée.

Répondre

0

J'ai pu m'authentifier en utilisant une méthode similaire à celle décrite dans l'exemple TLS Traffic Encryption Example.

Donc, comme on pouvait s'y attendre de l'exemple, je peux confirmer que SNMP4J utilise le keystore défini dans Java Propriété javax.net.ssl.keystore, javax.net.ssl.keyStorePassword, javax.net.ssl.trustStore et javax.net.ssl.trustStorePassword.

Voici les modifications que j'ai apportées à l'exemple pour le faire fonctionner.

L'alias (ou le nom de sécurité dans la documentation) doit être défini dans le constructeur CertifiedTarget afin qu'il sache quel certificat utiliser.

CertifiedTarget ct = new CertifiedTarget(new OctetString(alias)); 

Le niveau de sécurité doit être défini ou l'agent SNMP se plaindra et l'authentification échouera.

ct.setSecurityLevel(SecurityLevel.AUTH_PRIV); 

Le sujet SecurityCallback DN doit correspondre au sujet du certificat du serveur EXACTEMENT la façon dont il veut sinon il refusera toutes les réponses. Pour finir, vous devez enregistrer l'alias de certificat public du serveur (nom de sécurité) avec l'adresse.

securityCallback.addLocalCertMapping(ct.getAddress(), "snmpagent"); 

Il se réunit pour ressembler à ceci.

// Set java keystore manually 
System.setProperty("javax.net.ssl.keyStore", KEYSTORE_DIR); 
System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); 
System.setProperty("javax.net.ssl.trustStore", KEYSTORE_DIR); 
System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

// create the TLS transport mapping: 
TLSTM transport = new TLSTM(); 

// set the security callback (only required for command responder, 
// but also recommended for command generators) - 
// the callback will be configured later: 
DefaultTlsTmSecurityCallback securityCallback = new DefaultTlsTmSecurityCallback(); 
((TLSTM) transport).setSecurityCallback(securityCallback); 
MessageDispatcher md = new MessageDispatcherImpl(); 
// we need MPv3 for TLSTM: 
MPv3 mpv3 = new MPv3(); 
md.addMessageProcessingModel(mpv3); 

Snmp snmp = new Snmp(md, transport); 

// create and initialize the TransportSecurityModel TSM: 
SecurityModels.getInstance().addSecurityModel(new TSM(new OctetString(mpv3.getLocalEngineID()), false)); 

// do not forget to listen for responses: 
snmp.listen(); 

CertifiedTarget ct = new CertifiedTarget(new OctetString("alias")); 
ct.setVersion(SnmpConstants.version3); 
ct.setSecurityModel(SecurityModel.SECURITY_MODEL_TSM); 
ct.setAddress(GenericAddress.parse(myAddress)); 
ct.setSecurityLevel(SecurityLevel.AUTH_PRIV); 

securityCallback.addAcceptedSubjectDN("[email protected], CN=snmpagent, OU=Development, O=Net-SNMP, L=Davis, ST=CA, C=US"); 
securityCallback.addLocalCertMapping(ct.getAddress(), "snmpagentalias"); 

PDU pdu = new ScopedPDU(); 
pdu.add(new VariableBinding(new OID(someOid))); 
pdu.setType(PDU.GET); 

ResponseEvent response = snmp.send(pdu, ct); 

Vous devez également vous assurer que tous les certificats sont correctement configurés afin qu'ils les prennent réellement en charge. En guise de remarque, à la découverte de ceci mon équipe et moi avons découvert plusieurs bugs dans le traitement TLS par SNMP4J, principalement dans la couche de transport. Il semble que ce soit un problème de synchronisation (condition de course peut-être?) Où il obtiendra les données SNMP mais l'ignorera alors. Nous avons été en mesure de contourner le problème en réglant le délai d'expiration CertifiedTarget et les tentatives très élevées. Nous ferons officiellement rapport à ce sujet lorsque nous aurons plus d'informations.

+0

Merci pour la note. Cependant, pourriez-vous élaborer plus sur cette déclaration, "Enfin, vous devez enregistrer l'alias de certificat public du serveur (nom de sécurité) avec l'adresse." securityCallback.addLocalCertMapping (ct.getAddress(), "snmpagent"); " Concrètement, qu'entendez-vous par "serveur public alias de certificat"? Est-ce la même chose que l'alias défini dans "CertifiedTarget ct = new CertifiedTarget (new OctetString (alias))"? – stoneboy