2017-05-19 82 views
0

我正在研究一个项目,希望能够使用证书或密钥作为SNMPv3的身份验证方法。我们正在使用java库SNMP4J如何在SNMP4J中使用非对称密钥或证书身份验证?

在我的研究过程中,我发现SNMP使用TLS/DTLS进行消息加密,据推测也用于验证。 Source 1 | Source 2 | Source 3

纵观SNMP4J的小文档,我发现它允许使用TLS证书来加密流量。但我不确定如何使用公钥/私钥对完成身份验证。 TLS Traffic Encryption Example | SNMP4J Documentation

任何帮助,将不胜感激。

回答

0

我能够使用与示例TLS Traffic Encryption Example中所述类似的方法进行验证。

所以当人们从例子期待,我可以证实,SNMP4J使用密钥存储在Java属性javax.net.ssl.keystorejavax.net.ssl.keyStorePasswordjavax.net.ssl.trustStorejavax.net.ssl.trustStorePassword设置。

下面是我对示例使其工作的更改。

需要在CertifiedTarget构造函数中设置别名(或文档中的安全名称),以便知道使用哪个证书。

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

必须设置安全级别,否则SNMP代理将发出抱怨和验证失败。

ct.setSecurityLevel(SecurityLevel.AUTH_PRIV); 

SecurityCallback主题DN必须完全就是了否则会拒绝所有响应的方式与服务器证书的主题。

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

最后,您必须使用地址注册服务器公用证书别名(安全名称)。

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

它一起来看起来像这样。

// 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); 

您还必须确保所有证书都正确配置,以便它实际上需要它们。

作为一个侧面提示,在发现我的团队时,我发现了SNMP4J处理TLS中的几个错误,主要是在传输层中。这似乎是一个计时问题(竞争条件可能?),它将获取SNMP数据,但忽略它。我们能够通过设置CertifiedTarget超时并且重试非常高来避开它。当我们有更多的信息时,我们将正式报告。

+0

谢谢你的提示。但是,您能否详细说明此声明:“最后,您必须使用该地址注册服务器公钥证书别名(安全名称) securityCallback.addLocalCertMapping(ct.getAddress(),”snmpagent“);”具体来说,“服务器公共证书别名”是什么意思?是否与“CertifiedTarget ct = new CertifiedTarget(new OctetString(alias))”中设置的别名相同?“? – stoneboy

相关问题