如何在SNMP4J中使用非对称密钥或证书身份validation?
我正在开发一个项目,希望能够使用证书或密钥作为SNMPv3的身份validation方法。 我们正在使用java库SNMP4J 。
在我的研究过程中,我发现SNMP使用TLS / DTLS进行消息加密,并且据称也用于身份validation。 来源1 | 来源2 | 来源3
查看SNMP4J的小文档,我发现它允许使用TLS证书加密流量。 但我不确定如何使用公钥/私钥对进行身份validation。 TLS流量加密示例 | SNMP4J文档
任何帮助,将不胜感激。
我能够使用示例TLS流量加密示例中描述的类似方法进行身份validation。
正如人们所希望的那样,我可以确认SNMP4J使用Java属性javax.net.ssl.keystore
, javax.net.ssl.keyStorePassword
, javax.net.ssl.trustStore
和javax.net.ssl.trustStorePassword
设置的密钥库。 javax.net.ssl.trustStorePassword
。
以下是我对示例所做的更改,以使其工作。
需要在CertifiedTarget
构造函数中设置别名(或文档中的安全性名称),以便它知道要使用哪个证书。
CertifiedTarget ct = new CertifiedTarget(new OctetString(alias));
必须设置安全级别,否则SNMP代理将进行投诉并且validation失败。
ct.setSecurityLevel(SecurityLevel.AUTH_PRIV);
SecurityCallback
主题DN必须与服务器证书主题完全匹配,否则它将拒绝所有响应。
securityCallback.addAcceptedSubjectDN("EMAILADDRESS=admin@net-snmp.org, 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("EMAILADDRESS=admin@net-snmp.org, 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
超时并重试非常高来绕过它。 当我们获得更多信息时,我们将正式报告此事。
- spring security从DB获取用户ID
- 如何在GWT中实现登录屏幕?
- 在Jetty服务器中,如何获取需要客户端身份validation时使用的客户端证书?
- 使用AuthenticationFailureHandler在Spring Security中自定义身份validation失败响应
- 如何在Spring中为系统用户validation计划进程?
- Spring安全切换到Ldap身份validation和数据库权限
- Spring安全性返回String作为主体而不是登录失败时的UserDetails?
- Spring需要一个’AuthenticationManager’类型的bean
- Spring SecurityContext在错误页面上返回null身份validation