Java 如何在SNMP4J中使用非对称密钥或证书身份验证?

Java 如何在SNMP4J中使用非对称密钥或证书身份验证?,java,authentication,snmp,encryption-asymmetric,snmp4j,Java,Authentication,Snmp,Encryption Asymmetric,Snmp4j,我正在从事一个项目,希望能够使用证书或密钥作为SNMPv3的身份验证方法。我们正在使用java库 在我的研究过程中,我发现SNMP使用TLS/DTL进行消息加密,据说还用于身份验证 查看SNMP4J的小文档,我发现它允许使用TLS证书加密流量。但是,如果可能的话,我不确定如何使用公钥/私钥对进行身份验证 任何帮助都将不胜感激。我能够使用示例中描述的类似方法进行身份验证 因此,正如人们从示例中所期望的那样,我可以确认SNMP4J使用Java属性javax.net.ssl.keystore、java

我正在从事一个项目,希望能够使用证书或密钥作为SNMPv3的身份验证方法。我们正在使用java库

在我的研究过程中,我发现SNMP使用TLS/DTL进行消息加密,据说还用于身份验证

查看SNMP4J的小文档,我发现它允许使用TLS证书加密流量。但是,如果可能的话,我不确定如何使用公钥/私钥对进行身份验证


任何帮助都将不胜感激。

我能够使用示例中描述的类似方法进行身份验证

因此,正如人们从示例中所期望的那样,我可以确认SNMP4J使用Java属性
javax.net.ssl.keystore
javax.net.ssl.keystrepassword
javax.net.ssl.trustStore
javax.net.ssl.trustStorePassword
中设置的密钥库

下面是我对示例所做的更改,以使其正常工作

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

 CertifiedTarget ct = new CertifiedTarget(new OctetString(alias));
必须设置安全级别,否则SNMP代理将投诉身份验证失败

 ct.setSecurityLevel(SecurityLevel.AUTH_PRIV);
SecurityCallback
subject 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处理中的几个bug,主要是在传输层。这似乎是一个时间问题(可能是竞争条件?),它将获取SNMP数据,但随后忽略它。我们可以通过设置
CertifiedTarget
超时和重试次数来绕过它。当我们有更多信息时,我们将对此进行正式报告。

谢谢您的提示。但是,您能否详细说明一下这句话,“最后,您必须使用address.securityCallback.addLocalCertMapping(ct.getAddress(),“snmpagent”);注册服务器公共证书别名(安全名称),”具体来说,“服务器公共证书别名”是什么意思?这是否与“CertifiedTarget ct=new CertifiedTarget(new OctetString(alias));”中设置的别名相同?@8bitAlex您能否分享使用SNMP4j通过DTLS协议发送snmpv3陷阱的工作示例