2017-05-19 16 views
0

나는 SNMPv3에 대한 인증 방법으로 인증서 또는 키를 사용할 수 있기를 원하는 프로젝트에서 작업 중입니다. 우리는 자바 라이브러리 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 자바 재산권 javax.net.ssl.keystore, javax.net.ssl.keyStorePassword, javax.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