diff --git a/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/SnmpTransportContext.java b/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/SnmpTransportContext.java index 6e30b06a2c..ffd2b7e33c 100644 --- a/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/SnmpTransportContext.java +++ b/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/SnmpTransportContext.java @@ -127,7 +127,7 @@ public class SnmpTransportContext extends TransportContext { .build(); registerSessionMsgListener(sessionContext); } catch (Exception e) { - log.error("Failed to establish session for SNMP device {}: {}", device.getId(), e.toString()); + log.error("Failed to establish session for SNMP device {}", device.getId(), e); transportService.errorEvent(device.getTenantId(), device.getId(), "sessionEstablishing", e); return; } @@ -166,7 +166,7 @@ public class SnmpTransportContext extends TransportContext { log.trace("Configuration of the device {} was not updated", device); } } catch (Exception e) { - log.error("Failed to update session for SNMP device {}: {}", sessionContext.getDeviceId(), e.getMessage()); + log.error("Failed to update session for SNMP device {}", sessionContext.getDeviceId(), e); transportService.lifecycleEvent(sessionContext.getTenantId(), sessionContext.getDeviceId(), ComponentLifecycleEvent.UPDATED, false, e); destroyDeviceSession(sessionContext); } diff --git a/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpAuthService.java b/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpAuthService.java index b5f9cac09b..13f50621ad 100644 --- a/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpAuthService.java +++ b/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpAuthService.java @@ -24,6 +24,7 @@ import org.snmp4j.security.SecurityLevel; import org.snmp4j.security.SecurityModel; import org.snmp4j.security.SecurityProtocols; import org.snmp4j.security.USM; +import org.snmp4j.security.UsmUser; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OID; @@ -69,24 +70,26 @@ public class SnmpAuthService { case V3: OctetString username = new OctetString(deviceTransportConfig.getUsername()); OctetString securityName = new OctetString(deviceTransportConfig.getSecurityName()); - OctetString engineId = new OctetString(deviceTransportConfig.getEngineId()); + OctetString engineId = OctetString.fromString(deviceTransportConfig.getEngineId(), 16); OID authenticationProtocol = new OID(deviceTransportConfig.getAuthenticationProtocol().getOid()); + OctetString authenticationPassphrase = Optional.ofNullable(SecurityProtocols.getInstance().passwordToKey(authenticationProtocol, + new OctetString(deviceTransportConfig.getAuthenticationPassphrase()), engineId.getValue())) + .map(OctetString::new) + .orElseThrow(() -> new UnsupportedOperationException("Authentication protocol " + deviceTransportConfig.getAuthenticationProtocol() + " is not supported")); + OID privacyProtocol = new OID(deviceTransportConfig.getPrivacyProtocol().getOid()); - OctetString authenticationPassphrase = new OctetString(deviceTransportConfig.getAuthenticationPassphrase()); - authenticationPassphrase = new OctetString(SecurityProtocols.getInstance().passwordToKey(authenticationProtocol, authenticationPassphrase, engineId.getValue())); - OctetString privacyPassphrase = new OctetString(deviceTransportConfig.getPrivacyPassphrase()); - privacyPassphrase = new OctetString(SecurityProtocols.getInstance().passwordToKey(privacyProtocol, authenticationProtocol, privacyPassphrase, engineId.getValue())); + OctetString privacyPassphrase = Optional.ofNullable(SecurityProtocols.getInstance().passwordToKey(privacyProtocol, + authenticationProtocol, new OctetString(deviceTransportConfig.getPrivacyPassphrase()), engineId.getValue())) + .map(OctetString::new) + .orElseThrow(() -> new UnsupportedOperationException("Privacy protocol " + deviceTransportConfig.getPrivacyProtocol() + " is not supported")); USM usm = snmpTransportService.getSnmp().getUSM(); if (usm.hasUser(engineId, securityName)) { usm.removeAllUsers(username, engineId); } - usm.addLocalizedUser( - engineId.getValue(), username, - authenticationProtocol, authenticationPassphrase.getValue(), - privacyProtocol, privacyPassphrase.getValue() - ); + UsmUser usmUser = new UsmUser(username, authenticationProtocol, authenticationPassphrase, privacyProtocol, privacyPassphrase, engineId); + usm.addUser(username, engineId, usmUser); UserTarget userTarget = new UserTarget(); userTarget.setSecurityName(securityName); diff --git a/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpTransportService.java b/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpTransportService.java index 3a1d440d20..26008e2c82 100644 --- a/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpTransportService.java +++ b/common/transport/snmp/src/main/java/org/thingsboard/server/transport/snmp/service/SnmpTransportService.java @@ -148,6 +148,7 @@ public class SnmpTransportService implements TbTransportService, CommandResponde snmp.addNotificationListener(transportMapping, transportMapping.getListenAddress(), this); snmp.listen(); + SecurityProtocols.getInstance().addPredefinedProtocolSet(SecurityProtocols.SecurityProtocolSet.maxCompatibility); USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0); SecurityModels.getInstance().addSecurityModel(usm); }