예 TLS Traffic Encryption Example에 설명 된 것과 유사한 방법을 사용하여 인증 할 수있었습니다. 하나의 예에서 기대하는 것처럼
그래서, SNMP4J 자바 재산권 javax.net.ssl.keystore
, javax.net.ssl.keyStorePassword
, javax.net.ssl.trustStore
및 javax.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
제한 시간을 설정하여이 문제를 해결하고 실제로 다시 시도 할 수있었습니다. 우리는 더 많은 정보가있을 때이를 공식적으로보고 할 것입니다.
메모 주셔서 감사합니다. 그러나 마지막으로 주소에 서버 공용 인증서 별칭 (보안 이름)을 등록해야합니다. securityCallback.addLocalCertMapping (ct.getAddress(), "snmpagent"); " 특히 "서버 공개 인증서 별칭"은 무엇을 의미합니까? "CertifiedTarget ct = new CertifiedTarget (new OctetString (alias));"에서 설정 한 별칭과 동일합니까? – stoneboy