add huaweiyun mqtt

master
wenfei 3 weeks ago
parent 9c058bd20c
commit d7cdd6c36b

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module version="4"> <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager"> <component name="FacetManager">
<facet type="web" name="Web"> <facet type="web" name="Web">
<configuration> <configuration>
@ -10,10 +10,7 @@
<configuration> <configuration>
<setting name="validation-enabled" value="true" /> <setting name="validation-enabled" value="true" />
<setting name="provider-name" value="Hibernate" /> <setting name="provider-name" value="Hibernate" />
<datasource-mapping> <datasource-mapping />
<factory-entry name="admin-client-temperature" />
<factory-entry name="entityManagerFactory" />
</datasource-mapping>
<naming-strategy-map /> <naming-strategy-map />
</configuration> </configuration>
</facet> </facet>
@ -21,4 +18,114 @@
<configuration /> <configuration />
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-jpa:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.5.3" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.9" level="project" />
<orderEntry type="library" name="Maven: jakarta.transaction:jakarta.transaction-api:1.3.3" level="project" />
<orderEntry type="library" name="Maven: jakarta.persistence:jakarta.persistence-api:2.2.3" level="project" />
<orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.4.32.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.javassist:javassist:3.27.0-GA" level="project" />
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.22" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
<orderEntry type="library" name="Maven: org.jboss:jandex:2.2.3.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
<orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.3" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.1.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.4" level="project" />
<orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
<orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:2.3.4" level="project" />
<orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:3.0.12" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-jpa:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-orm:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.32" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.5.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.12.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.12.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.12.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.12.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.12.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.12.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.50" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.50" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.50" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.4" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.32" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.28" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.4" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.6" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.6" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.28" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.2.24" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.1" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.9" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:2.0.53" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension:2.0.53" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.53" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:4.9.2" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okio:okio:2.8.0" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.5.21" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.5.21" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.18.0" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains:annotations:19.0.0" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.36" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.14.0" level="project" />
<orderEntry type="library" name="Maven: com.oracle:ojdbc6:11.2.0.1.0" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.60" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.60" level="project" />
<orderEntry type="library" name="Maven: com.microsoft.sqlserver:mssql-jdbc:11.2.0.jre8" level="project" />
<orderEntry type="library" name="Maven: com.microsoft.azure:msal4j:1.13.0" level="project" />
<orderEntry type="library" name="Maven: com.nimbusds:oauth2-oidc-sdk:9.9" level="project" />
<orderEntry type="library" name="Maven: com.github.stephenc.jcip:jcip-annotations:1.0-1" level="project" />
<orderEntry type="library" name="Maven: com.nimbusds:content-type:2.1" level="project" />
<orderEntry type="library" name="Maven: com.nimbusds:lang-tag:1.5" level="project" />
<orderEntry type="library" name="Maven: com.nimbusds:nimbus-jose-jwt:9.10" level="project" />
<orderEntry type="library" name="Maven: net.minidev:json-smart:2.4.7" level="project" />
<orderEntry type="library" name="Maven: net.minidev:accessors-smart:2.4.7" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:9.1" level="project" />
<orderEntry type="library" name="Maven: com.kingbase8:kingbase8:8.6.0" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.13" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.postgresql:postgresql:42.7.7" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.checkerframework:checker-qual:3.49.3" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.40" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-crypto:5.8.37" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-core:5.8.37" level="project" />
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:3.0.2" level="project" />
</component>
</module> </module>

@ -66,14 +66,24 @@ public class AdminClientTemperatureApplication implements CommandLineRunner, App
// }else { // }else {
// log.info("temperatureService is empty"); // log.info("temperatureService is empty");
// } // }
if (temperatureEspService != null) {
if (temperatureService != null) {
log.info("------------------------"); log.info("------------------------");
log.info("temperatureEspService is not empty"); log.info("TemperatureController is not empty");
MqttDianDengTechClient client = new MqttDianDengTechClient(); MqttHuaWeiYunClient client = new MqttHuaWeiYunClient();
client.start(temperatureEspService); client.start(temperatureService);
}else { }else {
log.info("temperatureEspService is empty"); log.info("temperatureService is empty");
} }
// if (temperatureEspService != null) {
// log.info("------------------------");
// log.info("temperatureEspService is not empty");
// MqttDianDengTechClient client = new MqttDianDengTechClient();
// client.start(temperatureEspService);
// }else {
// log.info("temperatureEspService is empty");
// }
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }

@ -112,7 +112,7 @@ public class MqttDianDengTechClient {
log.info("message RSA:"+strData); log.info("message RSA:"+strData);
if(strData!=null&&strData.length()>=11){ if(strData!=null&&strData.length()>=11){
String[] strDataTemperature = strData.split(" "); String[] strDataTemperature = strData.split(" ");
temperatureEspService.saveTemperature(strDataTemperature[0],strDataTemperature[1],s); //temperatureEspService.saveTemperature(strDataTemperature[0],strDataTemperature[1],s);
} }
} }

@ -0,0 +1,148 @@
package com.rehome.mqttclienttemperature;
import com.rehome.mqttclienttemperature.service.TemperatureService;
import com.rehome.mqttclienttemperature.utils.MqttSSLSocketFactory;
import com.rehome.mqttclienttemperature.utils.UUIDUtil;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import javax.net.ssl.SSLSocketFactory;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
@Slf4j
public class MqttHuaWeiYunClient {
/**
* ip
*/
public static final String MQTT_BROKER_HOST = "ssl://mqtt.fileview123.com:8883";
/**
*
*/
public static String MQTT_CLIENT_ID = "AppServer_temperature_APP_server_02";
/**
*
*/
public static String USERNAME = "admin";
/**
*
*/
public static String PASSWORD = "publish452131wW452131wW$";
/**
*
*/
public static String TOPIC_FILTER = "/device/esp8266/+";
private volatile static MqttClient mqttClient;
private static MqttConnectOptions options;
private static int qos = 2;
//定时器
private Timer timer;
public MqttHuaWeiYunClient(){
try {
MQTT_CLIENT_ID = UUIDUtil.getUUID();
// host为主机名clientid即连接MQTT的客户端ID一般以客户端唯一标识符表示
// MemoryPersistence设置clientid的保存形式默认为以内存保存
mqttClient = new MqttClient(MQTT_BROKER_HOST, MQTT_CLIENT_ID, new MemoryPersistence());
// 配置参数信息
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录
// 这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(false);
// 设置用户名
options.setUserName(USERNAME);
// 设置密码
options.setPassword(PASSWORD.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//断线重连
options.setAutomaticReconnect(true);
//mqtt服务器端单双向加密
InputStream certInput = this.getClass().getResourceAsStream("/ssn/rootCA.crt");
InputStream clientCertInput = this.getClass().getResourceAsStream("/ssn/client.p12");
String password = "12345678";
SSLSocketFactory socketFactory = MqttSSLSocketFactory.getThreeSocketFactory(certInput,clientCertInput,password);
options.setSocketFactory(socketFactory);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(TemperatureService temperatureService) {
try {
// 连接
mqttClient.connect(options);
// 订阅
mqttClient.subscribe(TOPIC_FILTER,qos);
// 设置回调
mqttClient.setCallback(new MqttCallbackExtended(){
@Override
public void connectionLost(Throwable throwable) {
log.info("connectionLost");
try {
mqttClient.reconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) {
String strData = new String(mqttMessage.getPayload());
log.info("topic:"+s);
log.info("Qos:"+mqttMessage.getQos());
log.info("message RSA:"+strData);
//temperatureService.saveTemperature(strData,s);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
log.info("deliveryComplete---------"+ iMqttDeliveryToken.isComplete());
}
@Override
public void connectComplete(boolean b, String s) {
//连接成功后调用
try {
mqttClient.subscribe(TOPIC_FILTER,qos);//具体订阅代码
} catch (MqttException e) {
e.printStackTrace();
}
}
});
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
log.info("-------设定要指定任务--------");
try {
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!mqttClient.isConnected()) {
log.info("***** 没有连接到服务器 *****");
log.info("***** client to connect *****");
// 重新连接
mqttClient.connect(options);
}
if (mqttClient.isConnected()) {//连接成功,跳出连接
log.info("***** connect success *****");
}
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}, 10000,10000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -10,13 +10,16 @@ import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.TrustManagerFactory;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.security.KeyPair; import java.security.KeyPair;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.Security; import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.Collection;
public class MqttSSLSocketFactory { public class MqttSSLSocketFactory {
public static SSLSocketFactory getSingleSocketFactory(InputStream caCrtFileInputStream) throws Exception { public static SSLSocketFactory getSingleSocketFactory(InputStream caCrtFileInputStream) throws Exception {
@ -133,4 +136,35 @@ public class MqttSSLSocketFactory {
return sslContext.getSocketFactory(); return sslContext.getSocketFactory();
} }
public static SSLSocketFactory getThreeSocketFactory(InputStream certInput, InputStream clientCertInput,String password) throws Exception {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Collection<? extends Certificate> certs = cf.generateCertificates(certInput);
// 将服务器端 CA 证书存入 KeyStore
KeyStore tmKs = KeyStore.getInstance(KeyStore.getDefaultType());
tmKs.load(null, null);
int index = 0;
for (Certificate cert : certs) {
tmKs.setCertificateEntry("server_ca_" + index++, cert);
}
// 创建 TrustManager
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(tmKs);
// 将客户端证书存入 KeyStore
//String password = "mypassword"; //与导出密码一致
KeyStore kmKs = KeyStore.getInstance("PKCS12");
kmKs.load(clientCertInput, password.toCharArray());
// 创建 KeyManager
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(kmKs, password.toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
// SSLContext 中设置好 KeyManager 和 TrustManager
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
//SSLSocketFactory socketFactory = sslContext.getSocketFactory();
return sslContext.getSocketFactory();
}
} }

Binary file not shown.

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID5TCCAs2gAwIBAgIUI/GSmRnvgR3EeADRel5pdCosFykwDQYJKoZIhvcNAQEL
BQAwgYAxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlndWFuZ2RvbmcxDzANBgNVBAcM
BnpodWhhaTEPMA0GA1UECgwGcmVob21lMQ8wDQYDVQQLDAZyZWhvbWUxCzAJBgNV
BAMMAkNBMR0wGwYJKoZIhvcNAQkBFg5od2Y0NTJAMTYzLmNvbTAgFw0yNTExMTIw
ODM3NTVaGA8yMTI1MTAxOTA4Mzc1NVowgYAxCzAJBgNVBAYTAkNOMRIwEAYDVQQI
DAlndWFuZ2RvbmcxDzANBgNVBAcMBnpodWhhaTEPMA0GA1UECgwGcmVob21lMQ8w
DQYDVQQLDAZyZWhvbWUxCzAJBgNVBAMMAkNBMR0wGwYJKoZIhvcNAQkBFg5od2Y0
NTJAMTYzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOkSAxyB
b8kjM5+pzc4kjuWvgXR6w9UJgCl+uLFhqMTcco7VOK7mBfuykK980ICm7W+i+pi0
jpg8LCIkZv6G7oB8CAmrqNF4D4H8v0Z0eeFZtNC20eFn3mCwpetOyH6nT8ivsKJf
ap8sXKTVzqvIn1OCFiAbVqOLH+Aq3Ixd8s24+G5NcOWNSnMarZH074UCWKPLU3sq
NDYBnmR29+0LyWouA/XIloUpEgYZqujS3FmxQEt0TDbrrJRZyCFwV5E+nWVom5j0
HGLSUUocqvdT9EuRsyOT7BgbHlMjMf0Q24Za5b+j0zAE5UePlJAVyPSpOtFgbqDE
7u8fV0AuHrB17LkCAwEAAaNTMFEwHQYDVR0OBBYEFEvK+GTdVABY+1Afs5X3SF1l
Wm3wMB8GA1UdIwQYMBaAFEvK+GTdVABY+1Afs5X3SF1lWm3wMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFW4O0CHWhvJc7i8FaT2y30DPKvAqRqM
fIyANbrQEsf+R8GcvUz/jJmD1VHBksb75fH+Zy5vBMnohP/iHFNNUmYVp3wrFfrk
SvHsB6Vtk8WYKNtklnEqiucLMwvcuMw2MOIoUVCZh4Gl37qOQqBu2rYslZicgyft
RbW5d8Y0zspl8wJSTbVS5Lf6rm8ze3EXja1/HVMek+aG7gAS39Dq9op0llw0ldhZ
jLFI1/xJJBxJvN4KQFLrX7V9hjfvM6BsWXcf9GEPHmy0kfgRBUCA+EpVa4BaQY6p
ebLMi0rRbpFDnc2CIPdf2JOhGOmcrFymIFc/MzYpfP7uUAJiXBb2KIM=
-----END CERTIFICATE-----
Loading…
Cancel
Save