lwm2m - upDate lwm2mServer
This commit is contained in:
parent
0344b61ed3
commit
781ef66f0b
@ -17,17 +17,19 @@ package org.thingsboard.server.common.data.device.profile;
|
||||
|
||||
import lombok.Data;
|
||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServersConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.OtherConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.TelemetryMappingConfiguration;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class Lwm2mDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
|
||||
|
||||
private static final long serialVersionUID = 6257277825459600068L;
|
||||
|
||||
private TelemetryMappingConfiguration observeAttr;
|
||||
private LwM2MBootstrapServersConfiguration bootstrap;
|
||||
private List<LwM2MBootstrapServerCredential> bootstrap;
|
||||
private OtherConfiguration clientLwM2mSettings;
|
||||
|
||||
@Override
|
||||
|
||||
@ -22,6 +22,6 @@ import java.util.List;
|
||||
@Data
|
||||
public class LwM2MBootstrapServersConfiguration {
|
||||
|
||||
List<LwM2MBootstrapServerCredential> serverConfiguration;
|
||||
List<LwM2MBootstrapServerCredential> bootstrap;
|
||||
|
||||
}
|
||||
|
||||
@ -17,7 +17,6 @@ package org.thingsboard.server.transport.lwm2m.bootstrap;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.eclipse.californium.elements.util.SslContextUtil;
|
||||
import org.eclipse.californium.scandium.config.DtlsConnectorConfig;
|
||||
import org.eclipse.leshan.server.bootstrap.BootstrapSessionManager;
|
||||
import org.eclipse.leshan.server.californium.bootstrap.LeshanBootstrapServer;
|
||||
@ -26,8 +25,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.transport.TransportService;
|
||||
import org.thingsboard.server.common.transport.config.ssl.SslCredentials;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MBootstrapSecurityStore;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MInMemoryBootstrapConfigStore;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.store.LwM2MBootstrapSecurityStore;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.store.LwM2MInMemoryBootstrapConfigStore;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2mDefaultBootstrapSessionManager;
|
||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportBootstrapConfig;
|
||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
||||
@ -35,10 +34,6 @@ import org.thingsboard.server.transport.lwm2m.server.DefaultLwM2mTransportServic
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.PublicKey;
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
import static org.thingsboard.server.transport.lwm2m.server.LwM2MNetworkConfig.getCoapConfig;
|
||||
|
||||
@ -16,23 +16,27 @@
|
||||
package org.thingsboard.server.transport.lwm2m.bootstrap.secure;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.eclipse.leshan.core.SecurityMode;
|
||||
import org.eclipse.leshan.core.request.BindingMode;
|
||||
import org.eclipse.leshan.core.util.Hex;
|
||||
import org.eclipse.leshan.server.bootstrap.BootstrapConfig;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.AbstractLwM2MBootstrapClientCredentialWithKeys;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MBootstrapClientCredential;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.AbstractLwM2MBootstrapServerCredential;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@Slf4j
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class LwM2MBootstrapConfig implements Serializable {
|
||||
|
||||
List<LwM2MBootstrapServerCredential> serverConfiguration;
|
||||
@ -75,52 +79,68 @@ public class LwM2MBootstrapConfig implements Serializable {
|
||||
@Setter
|
||||
private LwM2MBootstrapClientCredential lwm2mServer;
|
||||
|
||||
public LwM2MBootstrapConfig(List<LwM2MBootstrapServerCredential> serverConfiguration, LwM2MBootstrapClientCredential bootstrapClientCredential) {
|
||||
public LwM2MBootstrapConfig(){};
|
||||
|
||||
public LwM2MBootstrapConfig(List<LwM2MBootstrapServerCredential> serverConfiguration, LwM2MBootstrapClientCredential bootstrapClientServer, LwM2MBootstrapClientCredential lwm2mClientServer) {
|
||||
this.serverConfiguration = serverConfiguration;
|
||||
this.bootstrapServer = bootstrapClientServer;
|
||||
this.lwm2mServer = lwm2mClientServer;
|
||||
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public BootstrapConfig getLwM2MBootstrapConfig() {
|
||||
BootstrapConfig configBs = new BootstrapConfig();
|
||||
/* Delete old security objects */
|
||||
AtomicInteger index = new AtomicInteger();
|
||||
/** Delete old security/config objects in LwM2mDefaultBootstrapSessionManager -> initTasks */
|
||||
configBs.toDelete.add("/0");
|
||||
configBs.toDelete.add("/1");
|
||||
/* Server Configuration (object 1) as defined in LWM2M 1.0.x TS. */
|
||||
BootstrapConfig.ServerConfig server0 = new BootstrapConfig.ServerConfig();
|
||||
// server0.shortId = servers.getShortId();
|
||||
// server0.lifetime = servers.getLifetime();
|
||||
// server0.defaultMinPeriod = servers.getDefaultMinPeriod();
|
||||
// server0.notifIfDisabled = servers.isNotifIfDisabled();
|
||||
// server0.binding = BindingMode.parse(servers.getBinding());
|
||||
configBs.servers.put(0, server0);
|
||||
/* Security Configuration (object 0) as defined in LWM2M 1.0.x TS. Bootstrap instance = 0 */
|
||||
// this.bootstrapServer.setBootstrapServerIs(true);
|
||||
// configBs.security.put(0, setServerSecurity(this.lwm2mServer.getHost(), this.lwm2mServer.getPort(), this.lwm2mServer.getSecurityHost(), this.lwm2mServer.getSecurityPort(), this.bootstrapServer.isBootstrapServerIs(), this.bootstrapServer.getSecurityMode(), this.bootstrapServer.getClientPublicKeyOrId(), this.bootstrapServer.getServerPublicKey(), this.bootstrapServer.getClientSecretKey(), this.bootstrapServer.getServerId()));
|
||||
// /* Security Configuration (object 0) as defined in LWM2M 1.0.x TS. Server instance = 1 */
|
||||
// configBs.security.put(1, setServerSecurity(this.lwm2mServer.getHost(), this.lwm2mServer.getPort(), this.lwm2mServer.getSecurityHost(), this.lwm2mServer.getSecurityPort(), this.lwm2mServer.isBootstrapServerIs(), this.lwm2mServer.getSecurityMode(), this.lwm2mServer.getClientPublicKeyOrId(), this.lwm2mServer.getServerPublicKey(), this.lwm2mServer.getClientSecretKey(), this.lwm2mServer.getServerId()));
|
||||
serverConfiguration.forEach(serverCredential -> {
|
||||
BootstrapConfig.ServerConfig serverConfig = new BootstrapConfig.ServerConfig();
|
||||
serverConfig.shortId = ((AbstractLwM2MBootstrapServerCredential)serverCredential).getShortServerId();
|
||||
serverConfig.lifetime = ((AbstractLwM2MBootstrapServerCredential)serverCredential).getLifetime();
|
||||
serverConfig.defaultMinPeriod = ((AbstractLwM2MBootstrapServerCredential)serverCredential).getDefaultMinPeriod();
|
||||
serverConfig.notifIfDisabled = ((AbstractLwM2MBootstrapServerCredential)serverCredential).isNotifIfDisabled();
|
||||
serverConfig.binding = BindingMode.parse(((AbstractLwM2MBootstrapServerCredential)serverCredential).getBinding());
|
||||
int k = index.get();
|
||||
configBs.servers.put(k, serverConfig);
|
||||
BootstrapConfig.ServerSecurity serverSecurity = setServerSecurity((AbstractLwM2MBootstrapServerCredential)serverCredential, serverCredential.getSecurityMode());
|
||||
configBs.security.put(k, serverSecurity);
|
||||
index.getAndIncrement();
|
||||
|
||||
});
|
||||
return configBs;
|
||||
}
|
||||
|
||||
private BootstrapConfig.ServerSecurity setServerSecurity(String host, Integer port, String securityHost, Integer securityPort, boolean bootstrapServer, SecurityMode securityMode, String clientPublicKey, String serverPublicKey, String secretKey, int serverId) {
|
||||
private BootstrapConfig.ServerSecurity setServerSecurity(AbstractLwM2MBootstrapServerCredential serverCredential, LwM2MSecurityMode securityMode) {
|
||||
BootstrapConfig.ServerSecurity serverSecurity = new BootstrapConfig.ServerSecurity();
|
||||
if (securityMode.equals(SecurityMode.NO_SEC)) {
|
||||
serverSecurity.uri = "coap://" + host + ":" + Integer.toString(port);
|
||||
} else {
|
||||
serverSecurity.uri = "coaps://" + securityHost + ":" + Integer.toString(securityPort);
|
||||
String serverUri = "coap://";
|
||||
byte[] publicKeyOrId = new byte[]{};;
|
||||
byte[] secretKey = new byte[]{};;
|
||||
serverSecurity.serverId = serverCredential.getShortServerId();
|
||||
serverSecurity.securityMode = SecurityMode.valueOf(securityMode.name());
|
||||
serverSecurity.bootstrapServer = serverCredential.isBootstrapServerIs();
|
||||
if (!LwM2MSecurityMode.NO_SEC.equals(securityMode)) {
|
||||
serverUri = "coaps://";
|
||||
if (serverSecurity.bootstrapServer) {
|
||||
publicKeyOrId = ((AbstractLwM2MBootstrapClientCredentialWithKeys)this.bootstrapServer).getDecodedClientPublicKeyOrId();
|
||||
secretKey = ((AbstractLwM2MBootstrapClientCredentialWithKeys)this.bootstrapServer).getDecodedClientSecretKey();
|
||||
|
||||
} else {
|
||||
publicKeyOrId = ((AbstractLwM2MBootstrapClientCredentialWithKeys)this.lwm2mServer).getDecodedClientPublicKeyOrId();
|
||||
secretKey = ((AbstractLwM2MBootstrapClientCredentialWithKeys)this.lwm2mServer).getDecodedClientSecretKey();
|
||||
}
|
||||
|
||||
}
|
||||
serverSecurity.bootstrapServer = bootstrapServer;
|
||||
serverSecurity.securityMode = securityMode;
|
||||
serverSecurity.publicKeyOrId = setPublicKeyOrId(clientPublicKey, securityMode);
|
||||
serverSecurity.serverPublicKey = (serverPublicKey != null && !serverPublicKey.isEmpty()) ? Hex.decodeHex(serverPublicKey.toCharArray()) : new byte[]{};
|
||||
serverSecurity.secretKey = (secretKey != null && !secretKey.isEmpty()) ? Hex.decodeHex(secretKey.toCharArray()) : new byte[]{};
|
||||
serverSecurity.serverId = serverId;
|
||||
serverUri += (((serverCredential.getHost().equals("0.0.0.0") ? "localhost" : serverCredential.getHost()) + ":" + serverCredential.getPort()));
|
||||
log.info("serverSecurity.uri = [{}]", serverUri);
|
||||
log.info("publicKeyOrId [{}]", Hex.encodeHexString(publicKeyOrId));
|
||||
log.info("secretKey [{}]", Hex.encodeHexString(secretKey));
|
||||
log.info("server [{}]", Hex.encodeHexString(serverCredential.getDecodedCServerPublicKey()));
|
||||
serverSecurity.uri = serverUri;
|
||||
serverSecurity.publicKeyOrId = publicKeyOrId;
|
||||
serverSecurity.secretKey = secretKey;
|
||||
serverSecurity.serverPublicKey = serverCredential.getDecodedCServerPublicKey();
|
||||
return serverSecurity;
|
||||
}
|
||||
|
||||
private byte[] setPublicKeyOrId(String publicKeyOrIdStr, SecurityMode securityMode) {
|
||||
return (publicKeyOrIdStr == null || publicKeyOrIdStr.isEmpty()) ? new byte[]{} :
|
||||
SecurityMode.PSK.equals(securityMode) ? publicKeyOrIdStr.getBytes(StandardCharsets.UTF_8) :
|
||||
Hex.decodeHex(publicKeyOrIdStr.toCharArray());
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,6 +34,7 @@ import org.eclipse.leshan.server.security.BootstrapSecurityStore;
|
||||
import org.eclipse.leshan.server.security.SecurityChecker;
|
||||
import org.eclipse.leshan.server.security.SecurityInfo;
|
||||
import org.thingsboard.server.common.transport.TransportService;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.store.LwM2MBootstrapSecurityStore;
|
||||
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -118,6 +119,7 @@ public class LwM2mDefaultBootstrapSessionManager extends DefaultBootstrapSession
|
||||
session.setModel(modelProvider.getObjectModel(session, tasks.supportedObjects));
|
||||
|
||||
// set Requests to Send
|
||||
log.info("tasks.requestsToSend = [{}]", tasks.requestsToSend);
|
||||
session.setRequests(tasks.requestsToSend);
|
||||
|
||||
// prepare list where we will store Responses
|
||||
|
||||
@ -13,12 +13,10 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.transport.lwm2m.bootstrap.secure;
|
||||
package org.thingsboard.server.transport.lwm2m.bootstrap.store;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.eclipse.leshan.core.SecurityMode;
|
||||
import org.eclipse.leshan.core.util.Hex;
|
||||
import org.eclipse.leshan.core.util.SecurityUtil;
|
||||
import org.eclipse.leshan.server.bootstrap.BootstrapConfig;
|
||||
import org.eclipse.leshan.server.bootstrap.EditableBootstrapConfigStore;
|
||||
import org.eclipse.leshan.server.bootstrap.InvalidConfigurationException;
|
||||
@ -26,9 +24,10 @@ import org.eclipse.leshan.server.security.BootstrapSecurityStore;
|
||||
import org.eclipse.leshan.server.security.SecurityInfo;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServersConfiguration;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.AbstractLwM2MBootstrapServerCredential;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MBootstrapConfig;
|
||||
import org.thingsboard.server.transport.lwm2m.secure.LwM2mCredentialsSecurityInfoValidator;
|
||||
import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo;
|
||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mSessionMsgListener;
|
||||
@ -42,12 +41,12 @@ import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import static org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mTypeServer.BOOTSTRAP;
|
||||
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_ERROR;
|
||||
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_INFO;
|
||||
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_TELEMETRY;
|
||||
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.getBootstrapParametersFromThingsboard;
|
||||
|
||||
@Slf4j
|
||||
@Service("LwM2MBootstrapSecurityStore")
|
||||
@ -73,7 +72,7 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
|
||||
public Iterator<SecurityInfo> getAllByEndpoint(String endPoint) {
|
||||
// TODO
|
||||
TbLwM2MSecurityInfo store = lwM2MCredentialsSecurityInfoValidator.getEndpointSecurityInfoByCredentialsId(endPoint, BOOTSTRAP);
|
||||
if (store.getBootstrapCredentialConfig() != null && store.getSecurityMode() != null) {
|
||||
if (store.getBootstrapCredentialConfig() != null) {
|
||||
/* add value to store from BootstrapJson */
|
||||
this.setBootstrapConfigScurityInfo(store);
|
||||
BootstrapConfig bsConfigNew = store.getBootstrapConfig();
|
||||
@ -123,15 +122,15 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
|
||||
LwM2MBootstrapConfig lwM2MBootstrapConfig = this.getParametersBootstrap(store);
|
||||
if (lwM2MBootstrapConfig != null) {
|
||||
/* Security info */
|
||||
switch (lwM2MBootstrapConfig.getBootstrapServer().getSecurityMode()) {
|
||||
/* Use RPK only */
|
||||
case PSK:
|
||||
// switch (lwM2MBootstrapConfig.getBootstrapServer().getSecurityMode()) {
|
||||
// /* Use RPK only */
|
||||
// case PSK:
|
||||
// store.setSecurityInfo(SecurityInfo.newPreSharedKeyInfo(store.getEndpoint(),
|
||||
// lwM2MBootstrapConfig.getBootstrapServer().getClientPublicKeyOrId(),
|
||||
// Hex.decodeHex(lwM2MBootstrapConfig.getBootstrapServer().getClientSecretKey().toCharArray())));
|
||||
store.setSecurityMode(SecurityMode.PSK);
|
||||
break;
|
||||
case RPK:
|
||||
// store.setSecurityMode(SecurityMode.PSK);
|
||||
// break;
|
||||
// case RPK:
|
||||
// try {
|
||||
//// store.setSecurityInfo(SecurityInfo.newRawPublicKeyInfo(store.getEndpoint(),
|
||||
//// SecurityUtil.publicKey.decode(Hex.decodeHex(lwM2MBootstrapConfig.getBootstrapServer().getClientPublicKeyOrId().toCharArray()))));
|
||||
@ -140,16 +139,16 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
|
||||
// } catch (IOException | GeneralSecurityException e) {
|
||||
// log.error("Unable to decode Client public key for [{}] [{}]", store.getEndpoint(), e.getMessage());
|
||||
// }
|
||||
case X509:
|
||||
store.setSecurityInfo(SecurityInfo.newX509CertInfo(store.getEndpoint()));
|
||||
store.setSecurityMode(SecurityMode.X509);
|
||||
break;
|
||||
case NO_SEC:
|
||||
store.setSecurityMode(SecurityMode.NO_SEC);
|
||||
store.setSecurityInfo(null);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
// case X509:
|
||||
// store.setSecurityInfo(SecurityInfo.newX509CertInfo(store.getEndpoint()));
|
||||
// store.setSecurityMode(SecurityMode.X509);
|
||||
// break;
|
||||
// case NO_SEC:
|
||||
// store.setSecurityMode(SecurityMode.NO_SEC);
|
||||
// store.setSecurityInfo(null);
|
||||
// break;
|
||||
// default:
|
||||
// }
|
||||
BootstrapConfig bootstrapConfig = lwM2MBootstrapConfig.getLwM2MBootstrapConfig();
|
||||
store.setBootstrapConfig(bootstrapConfig);
|
||||
}
|
||||
@ -158,7 +157,7 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
|
||||
private LwM2MBootstrapConfig getParametersBootstrap(TbLwM2MSecurityInfo store) {
|
||||
LwM2MBootstrapConfig lwM2MBootstrapConfig = store.getBootstrapCredentialConfig();
|
||||
if (lwM2MBootstrapConfig != null) {
|
||||
LwM2MBootstrapServersConfiguration bootstrapObject = getBootstrapParametersFromThingsboard(store.getDeviceProfile());
|
||||
// LwM2MBootstrapServersConfiguration bootstrapObject = getBootstrapParametersFromThingsboard(store.getDeviceProfile());
|
||||
// lwM2MBootstrapConfig.setServers(JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getServers()), LwM2MBootstrapServers.class));
|
||||
// LwM2MServerBootstrap bootstrapServerProfile = JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getBootstrapServer()), LwM2MServerBootstrap.class);
|
||||
// if (SecurityMode.NO_SEC != bootstrapServerProfile.getSecurityMode() && bootstrapServerProfile != null) {
|
||||
@ -170,23 +169,25 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
|
||||
// profileLwm2mServer.setSecurityHost(profileLwm2mServer.getHost());
|
||||
// profileLwm2mServer.setSecurityPort(profileLwm2mServer.getPort());
|
||||
// }
|
||||
// UUID sessionUUiD = UUID.randomUUID();
|
||||
// TransportProtos.SessionInfoProto sessionInfo = helper.getValidateSessionInfo(store.getMsg(), sessionUUiD.getMostSignificantBits(), sessionUUiD.getLeastSignificantBits());
|
||||
// bsSessions.put(store.getEndpoint(), sessionInfo);
|
||||
// context.getTransportService().registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(null, null, null, sessionInfo, context.getTransportService()));
|
||||
// if (this.getValidatedSecurityMode(lwM2MBootstrapConfig.getBootstrapServer(), bootstrapServerProfile, lwM2MBootstrapConfig.getLwm2mServer(), profileLwm2mServer)) {
|
||||
|
||||
|
||||
UUID sessionUUiD = UUID.randomUUID();
|
||||
TransportProtos.SessionInfoProto sessionInfo = helper.getValidateSessionInfo(store.getMsg(), sessionUUiD.getMostSignificantBits(), sessionUUiD.getLeastSignificantBits());
|
||||
bsSessions.put(store.getEndpoint(), sessionInfo);
|
||||
context.getTransportService().registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(null, null, null, sessionInfo, context.getTransportService()));
|
||||
if (this.getValidatedSecurityMode(lwM2MBootstrapConfig)) {
|
||||
// lwM2MBootstrapConfig.setBootstrapServer(new LwM2MServerBootstrap(lwM2MBootstrapConfig.getBootstrapServer(), bootstrapServerProfile));
|
||||
// lwM2MBootstrapConfig.setLwm2mServer(new LwM2MServerBootstrap(lwM2MBootstrapConfig.getLwm2mServer(), profileLwm2mServer));
|
||||
// String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LWM2M_INFO, store.getEndpoint());
|
||||
// helper.sendParametersOnThingsboardTelemetry(helper.getKvStringtoThingsboard(LOG_LWM2M_TELEMETRY, logMsg), sessionInfo);
|
||||
// return lwM2MBootstrapConfig;
|
||||
// } else {
|
||||
// log.error(" [{}] Different values SecurityMode between of client and profile.", store.getEndpoint());
|
||||
// log.error("{} getParametersBootstrap: [{}] Different values SecurityMode between of client and profile.", LOG_LWM2M_ERROR, store.getEndpoint());
|
||||
// String logMsg = String.format("%s: getParametersBootstrap: %s Different values SecurityMode between of client and profile.", LOG_LWM2M_ERROR, store.getEndpoint());
|
||||
// helper.sendParametersOnThingsboardTelemetry(helper.getKvStringtoThingsboard(LOG_LWM2M_TELEMETRY, logMsg), sessionInfo);
|
||||
// return null;
|
||||
// }
|
||||
String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LWM2M_INFO, store.getEndpoint());
|
||||
helper.sendParametersOnThingsboardTelemetry(helper.getKvStringtoThingsboard(LOG_LWM2M_TELEMETRY, logMsg), sessionInfo);
|
||||
return lwM2MBootstrapConfig;
|
||||
} else {
|
||||
log.error(" [{}] Different values SecurityMode between of client and profile.", store.getEndpoint());
|
||||
log.error("{} getParametersBootstrap: [{}] Different values SecurityMode between of client and profile.", LOG_LWM2M_ERROR, store.getEndpoint());
|
||||
String logMsg = String.format("%s: getParametersBootstrap: %s Different values SecurityMode between of client and profile.", LOG_LWM2M_ERROR, store.getEndpoint());
|
||||
helper.sendParametersOnThingsboardTelemetry(helper.getKvStringtoThingsboard(LOG_LWM2M_TELEMETRY, logMsg), sessionInfo);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
log.error("Unable to decode Json or Certificate for [{}]", store.getEndpoint());
|
||||
return null;
|
||||
@ -196,15 +197,27 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
|
||||
* Bootstrap security have to sync between (bootstrapServer in credential and bootstrapServer in profile)
|
||||
* and (lwm2mServer in credential and lwm2mServer in profile
|
||||
*
|
||||
* @param bootstrapFromCredential - Bootstrap -> Security of bootstrapServer in credential
|
||||
* @param bootstrapServerProfile - Bootstrap -> Security of bootstrapServer in profile
|
||||
* @param lwm2mFromCredential - Bootstrap -> Security of lwm2mServer in credential
|
||||
* @param profileLwm2mServer - Bootstrap -> Security of lwm2mServer in profile
|
||||
* @return false if not sync between SecurityMode of Bootstrap credential and profile
|
||||
*/
|
||||
private boolean getValidatedSecurityMode(LwM2MServerBootstrap bootstrapFromCredential, LwM2MServerBootstrap bootstrapServerProfile, LwM2MServerBootstrap lwm2mFromCredential, LwM2MServerBootstrap profileLwm2mServer) {
|
||||
return (bootstrapFromCredential.getSecurityMode().equals(bootstrapServerProfile.getSecurityMode()) &&
|
||||
lwm2mFromCredential.getSecurityMode().equals(profileLwm2mServer.getSecurityMode()));
|
||||
// private boolean getValidatedSecurityMode(LwM2MServerBootstrap bootstrapFromCredential, LwM2MServerBootstrap bootstrapServerProfile, LwM2MServerBootstrap lwm2mFromCredential, LwM2MServerBootstrap profileLwm2mServer) {
|
||||
private boolean getValidatedSecurityMode(LwM2MBootstrapConfig lwM2MBootstrapConfig) {
|
||||
LwM2MSecurityMode bootstrapServerSecurityMode = lwM2MBootstrapConfig.getBootstrapServer().getSecurityMode();
|
||||
LwM2MSecurityMode lwm2mServerSecurityMode = lwM2MBootstrapConfig.getLwm2mServer().getSecurityMode();
|
||||
AtomicBoolean validBs = new AtomicBoolean(true);
|
||||
AtomicBoolean validLw = new AtomicBoolean(true);
|
||||
lwM2MBootstrapConfig.getServerConfiguration().forEach(serverCredential -> {
|
||||
if (((AbstractLwM2MBootstrapServerCredential)serverCredential).isBootstrapServerIs()) {
|
||||
if (!bootstrapServerSecurityMode.equals(serverCredential.getSecurityMode())) {
|
||||
validBs.set(false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!lwm2mServerSecurityMode.equals(serverCredential.getSecurityMode())) {
|
||||
validLw.set(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
return validBs.get()&validLw.get();
|
||||
}
|
||||
|
||||
public TransportProtos.SessionInfoProto getSessionByEndpoint(String endpoint) {
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.transport.lwm2m.bootstrap.secure;
|
||||
package org.thingsboard.server.transport.lwm2m.bootstrap.store;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.eclipse.leshan.core.request.Identity;
|
||||
@ -24,13 +24,14 @@ import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.server.common.data.StringUtils;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredential;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.PSKClientCredential;
|
||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.RPKClientCredential;
|
||||
import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
|
||||
import org.thingsboard.server.common.transport.TransportServiceCallback;
|
||||
import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceLwM2MCredentialsRequestMsg;
|
||||
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
||||
import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MBootstrapConfig;
|
||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
||||
import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MClientCredentials;
|
||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext;
|
||||
@ -68,17 +69,16 @@ public class LwM2mCredentialsSecurityInfoValidator {
|
||||
@Override
|
||||
public void onSuccess(ValidateDeviceCredentialsResponse msg) {
|
||||
log.trace("Validated credentials: [{}] [{}]", credentialsId, msg);
|
||||
String credentialsBody = msg.getCredentials();
|
||||
resultSecurityStore[0] = createSecurityInfo(credentialsId, credentialsBody, keyValue);
|
||||
resultSecurityStore[0].setMsg(msg);
|
||||
resultSecurityStore[0].setDeviceProfile(msg.getDeviceProfile());
|
||||
resultSecurityStore[0] = createSecurityInfo(credentialsId, msg, keyValue);
|
||||
latch.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
log.trace("[{}] [{}] Failed to process credentials ", credentialsId, e);
|
||||
resultSecurityStore[0] = createSecurityInfo(credentialsId, null, null);
|
||||
TbLwM2MSecurityInfo result = new TbLwM2MSecurityInfo();
|
||||
result.setEndpoint(credentialsId);
|
||||
resultSecurityStore[0] = result;
|
||||
latch.countDown();
|
||||
}
|
||||
});
|
||||
@ -88,50 +88,47 @@ public class LwM2mCredentialsSecurityInfoValidator {
|
||||
log.error("Failed to await credentials!", e);
|
||||
}
|
||||
|
||||
return resultSecurityStore[0];
|
||||
|
||||
// if ((CLIENT.equals(keyValue) && securityInfo.getSecurityMode() == null) ||
|
||||
// (BOOTSTRAP.equals(keyValue) && securityInfo.getBootstrapCredentialConfig().getBootstrapServer()==null && securityInfo.getBootstrapCredentialConfig().getLwm2mServer()==null)){
|
||||
// throw new LwM2MAuthException();
|
||||
// }
|
||||
//
|
||||
// return securityInfo;
|
||||
TbLwM2MSecurityInfo securityInfo = resultSecurityStore[0];
|
||||
if ((CLIENT.equals(keyValue) && securityInfo.getSecurityMode() == null)) {
|
||||
throw new LwM2MAuthException();
|
||||
}
|
||||
return securityInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new SecurityInfo
|
||||
*
|
||||
* @return SecurityInfo
|
||||
*/
|
||||
private TbLwM2MSecurityInfo createSecurityInfo(String endpoint, String jsonStr, LwM2mTypeServer keyValue) {
|
||||
private TbLwM2MSecurityInfo createSecurityInfo(String endpoint, ValidateDeviceCredentialsResponse msg, LwM2mTypeServer keyValue) {
|
||||
TbLwM2MSecurityInfo result = new TbLwM2MSecurityInfo();
|
||||
LwM2MClientCredentials credentials = JacksonUtil.fromString(jsonStr, LwM2MClientCredentials.class);
|
||||
LwM2MClientCredentials credentials = JacksonUtil.fromString(msg.getCredentials(), LwM2MClientCredentials.class);
|
||||
if (credentials != null) {
|
||||
result.setMsg(msg);
|
||||
result.setDeviceProfile(msg.getDeviceProfile());
|
||||
result.setEndpoint(credentials.getClient().getEndpoint());
|
||||
// if ((keyValue.equals(CLIENT))) {
|
||||
switch (credentials.getClient().getSecurityConfigClientMode()) {
|
||||
case NO_SEC:
|
||||
createClientSecurityInfoNoSec(result);
|
||||
break;
|
||||
case PSK:
|
||||
createClientSecurityInfoPSK(result, endpoint, credentials.getClient());
|
||||
break;
|
||||
case RPK:
|
||||
createClientSecurityInfoRPK(result, endpoint, credentials.getClient());
|
||||
break;
|
||||
case X509:
|
||||
createClientSecurityInfoX509(result, endpoint, credentials.getClient());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// } else
|
||||
if (keyValue.equals(BOOTSTRAP)) {
|
||||
result.setBootstrapCredentialConfig(credentials.getBootstrap());
|
||||
if (LwM2MSecurityMode.PSK.equals(credentials.getClient().getSecurityConfigClientMode())) {
|
||||
PSKClientCredential pskClientConfig = (PSKClientCredential) credentials.getClient();
|
||||
endpoint = StringUtils.isNotEmpty(pskClientConfig.getEndpoint()) ? pskClientConfig.getEndpoint() : endpoint;
|
||||
}
|
||||
result.setEndpoint(endpoint);
|
||||
// result.setSecurityMode(credentials.getBootstrap().getBootstrapServer().getSecurityMode());
|
||||
} else {
|
||||
result.setEndpoint(credentials.getClient().getEndpoint());
|
||||
switch (credentials.getClient().getSecurityConfigClientMode()) {
|
||||
case NO_SEC:
|
||||
createClientSecurityInfoNoSec(result);
|
||||
break;
|
||||
case PSK:
|
||||
createClientSecurityInfoPSK(result, endpoint, credentials.getClient());
|
||||
break;
|
||||
case RPK:
|
||||
createClientSecurityInfoRPK(result, endpoint, credentials.getClient());
|
||||
break;
|
||||
case X509:
|
||||
createClientSecurityInfoX509(result, endpoint, credentials.getClient());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
LwM2MBootstrapConfig bootstrapCredentialConfig = new LwM2MBootstrapConfig(((Lwm2mDeviceProfileTransportConfiguration) msg.getDeviceProfile().getProfileData().getTransportConfiguration()).getBootstrap(),
|
||||
credentials.getBootstrap().getBootstrapServer(), credentials.getBootstrap().getLwm2mServer());
|
||||
result.setBootstrapCredentialConfig(bootstrapCredentialConfig);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
@ -28,12 +28,13 @@ import java.io.Serializable;
|
||||
@Data
|
||||
public class TbLwM2MSecurityInfo implements Serializable {
|
||||
private ValidateDeviceCredentialsResponse msg;
|
||||
private DeviceProfile deviceProfile;
|
||||
private String endpoint;
|
||||
private SecurityInfo securityInfo;
|
||||
private SecurityMode securityMode;
|
||||
private DeviceProfile deviceProfile;
|
||||
|
||||
|
||||
/** bootstrap */
|
||||
private LwM2MBootstrapConfig bootstrapCredentialConfig;
|
||||
private String endpoint;
|
||||
private BootstrapConfig bootstrapConfig;
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@ import org.eclipse.leshan.server.security.SecurityInfo;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.thingsboard.server.transport.lwm2m.secure.LwM2mCredentialsSecurityInfoValidator;
|
||||
import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo;
|
||||
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
@ -71,7 +72,12 @@ public class TbLwM2mSecurityStore implements TbMainSecurityStore {
|
||||
public SecurityInfo getByIdentity(String pskIdentity) {
|
||||
SecurityInfo securityInfo = securityStore.getByIdentity(pskIdentity);
|
||||
if (securityInfo == null) {
|
||||
securityInfo = fetchAndPutSecurityInfo(pskIdentity);
|
||||
try {
|
||||
securityInfo = fetchAndPutSecurityInfo(pskIdentity);
|
||||
} catch (LwM2MAuthException e) {
|
||||
log.info("Registration failed: FORBIDDEN, endpointId: [{}]", pskIdentity);
|
||||
securityInfo = SecurityInfo.newPreSharedKeyInfo(pskIdentity, pskIdentity, new byte[]{0x00});
|
||||
}
|
||||
}
|
||||
return securityInfo;
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ import org.eclipse.leshan.server.registration.Registration;
|
||||
import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServersConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
|
||||
import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
|
||||
import org.thingsboard.server.common.data.ota.OtaPackageKey;
|
||||
@ -181,7 +181,7 @@ public class LwM2MTransportUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static LwM2MBootstrapServersConfiguration getBootstrapParametersFromThingsboard(DeviceProfile deviceProfile) {
|
||||
public static List<LwM2MBootstrapServerCredential> getBootstrapParametersFromThingsboard(DeviceProfile deviceProfile) {
|
||||
return toLwM2MClientProfile(deviceProfile).getBootstrap();
|
||||
}
|
||||
|
||||
|
||||
@ -46,7 +46,6 @@ import org.thingsboard.server.common.data.DeviceProfileType;
|
||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||
import org.thingsboard.server.common.data.OtaPackage;
|
||||
import org.thingsboard.server.common.data.Tenant;
|
||||
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServersConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.CoapDeviceProfileTransportConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.CoapDeviceTypeConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.DefaultCoapDeviceTypeConfiguration;
|
||||
@ -418,8 +417,8 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
|
||||
}
|
||||
}
|
||||
} else if (transportConfiguration instanceof Lwm2mDeviceProfileTransportConfiguration) {
|
||||
LwM2MBootstrapServersConfiguration lwM2MBootstrapServersConfiguration = ((Lwm2mDeviceProfileTransportConfiguration) transportConfiguration).getBootstrap();
|
||||
for (LwM2MBootstrapServerCredential bootstrapServerCredential : lwM2MBootstrapServersConfiguration.getServerConfiguration()) {
|
||||
List<LwM2MBootstrapServerCredential> lwM2MBootstrapServersConfigurations = ((Lwm2mDeviceProfileTransportConfiguration) transportConfiguration).getBootstrap();
|
||||
for (LwM2MBootstrapServerCredential bootstrapServerCredential : lwM2MBootstrapServersConfigurations) {
|
||||
validateLwm2mServersCredentialOfBootstrapForClient(bootstrapServerCredential);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user