master
hwf452 2 years ago
parent 73ba7f711a
commit 884c43766f

@ -34,8 +34,8 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
namespace 'com.bjzc.zjdxj'
}

@ -53,8 +53,8 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
namespace 'com.bjzc.zjyxdxj'
}
@ -92,6 +92,7 @@ dependencies {
//mqtt
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'org.bouncycastle:bcpkix-jdk15on:1.56'
implementation 'org.bouncycastle:bcpkix-jdk15on:1.47'
implementation 'commons-codec:commons-codec:1.15'
testImplementation 'junit:junit:4.13.1'

@ -312,10 +312,6 @@
<service
android:name="com.bjzc.zjyxdxj.bleUtil.BluetoothLeService"
android:enabled="true" />
<service
android:name="com.bjzc.zjyxdxj.service.MQTTPushService"
android:exported="true"
android:process=":com.bjzc.zjdxj.mqttpushservice" />
<provider
android:name="androidx.core.content.FileProvider"

@ -263,8 +263,7 @@ public class LoginActivity extends BaseActivity {
String jsonDecode = RSAUtils.decryptBASE64StrByPublic(json);
if(TextUtils.isEmpty(jsonDecode)){
//showToast(UiUtlis.getString(context, R.string.login_no_connect_to_server));
//showToast("登录异常...");
showToast("登录异常...");
}else{
UserInfo userInfo = GsonUtils.GsonToBean(jsonDecode, UserInfo.class);
showLog(new Gson().toJson(userInfo));

@ -1,7 +1,6 @@
package com.bjzc.zjyxdxj.activity;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
@ -9,9 +8,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
@ -38,21 +35,21 @@ import com.bjzc.zjyxdxj.bean.ApkUpdateBean;
import com.bjzc.zjyxdxj.bean.GridViewBean;
import com.bjzc.zjyxdxj.bleUtil.BluetoothLeService;
import com.bjzc.zjyxdxj.contans.Contans;
import com.bjzc.zjyxdxj.service.MQTTPushService;
import com.bjzc.zjyxdxj.utils.AppManager;
import com.bjzc.zjyxdxj.utils.FlashUtil;
import com.bjzc.zjyxdxj.utils.HttpUtils;
import com.bjzc.zjyxdxj.utils.MqttSSLPublishServer;
import com.bjzc.zjyxdxj.utils.SPUtils;
import com.bjzc.zjyxdxj.utils.StatusBarUtil;
import com.bjzc.zjyxdxj.weight.AuditDialog;
import com.bjzc.zjyxdxj.weight.toastviewbymyself;
import com.google.gson.Gson;
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import retrofit2.Call;
@ -82,6 +79,10 @@ public class MainActivity extends BaseActivity3 {
public static final int REQUEST_CHECK_TEMPERATURE = 1;
public static final int REQUEST_CHECK_VIBRATION = 2;
MqttSSLPublishServer mqttPublishServer;
//定时器
private Timer timer;
@Override
public int getLayoutId() {
@ -95,12 +96,15 @@ public class MainActivity extends BaseActivity3 {
tvLoginUser = findViewById(R.id.tv_login_user);
gv = findViewById(R.id.gv);
//initMqtt();
flashUtil = new FlashUtil();
toolbar.setBackgroundColor(Color.parseColor("#00000000"));
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置透明导航栏
StatusBarUtil.transparencyBar(MainActivity.this);//设置透明状态栏
//当选择外网时才会开启一键招回
if(Contans.IP.equals(Contans.network_type_extranet)){
initMqtt();
}
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@ -398,6 +402,29 @@ public class MainActivity extends BaseActivity3 {
}
}
@Override
protected void onResume() {
super.onResume();
if(Contans.IP.equals(Contans.network_type_extranet)){
if(mqttPublishServer==null){
mqttPublishServer = new MqttSSLPublishServer(this);
}
if(timer==null){
try {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
mqttPublishServer.start();
}
}, 1000, 60000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Override
public void onDestroy() {
mBluetoothLeService.disconnect();
@ -409,8 +436,13 @@ public class MainActivity extends BaseActivity3 {
Intent intent = new Intent(this, BluetoothLeService.class);
stopService(intent);
//停止MQTT推送服务
Intent intentMqtt = new Intent(MainActivity.this, MQTTPushService.class);
stopService(intentMqtt);
if(mqttPublishServer!=null){
mqttPublishServer.destroyAll();
mqttPublishServer=null;
}
if(timer!=null){
timer.cancel();
}
super.onDestroy();
}
@ -512,8 +544,18 @@ public class MainActivity extends BaseActivity3 {
public void initMqtt() {
//开启MQTT推送服务
Intent intent = new Intent(MainActivity.this, MQTTPushService.class);
startService(intent);
//开启MQTT一键招回
mqttPublishServer = new MqttSSLPublishServer(this);
try {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
mqttPublishServer.start();
}
}, 1000, 60000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -117,7 +117,7 @@ public abstract class BaseActivity extends AutoLayoutActivity {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
} else {
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_UPDATE_CURRENT);
}
//设定要过滤的标签动作这里只接收ACTION_NDEF_DISCOVERED类型
ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

@ -84,7 +84,7 @@ public abstract class BaseActivity3 extends AutoLayoutActivity {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
} else {
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_UPDATE_CURRENT);
}
//pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
//设定要过滤的标签动作这里只接收ACTION_NDEF_DISCOVERED类型

@ -1,63 +0,0 @@
package com.bjzc.zjyxdxj.service;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.Looper;
import androidx.annotation.Nullable;
import com.bjzc.zjyxdxj.utils.MqttSSLPublishServer;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
public class MQTTPushService extends Service {
private int one;
private SimpleBinder mBinder;
public MqttAndroidClient mClient;
private MqttConnectOptions options;
public static String clientId = "android";
@Override
public void onCreate() {
super.onCreate();
mBinder = new SimpleBinder();
MqttSSLPublishServer mqttPublishServer = new MqttSSLPublishServer(this);
mqttPublishServer.start();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
if (mBinder != null) {
return mBinder;
}
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
class SimpleBinder extends Binder {
public void doTask() {
new Thread(new Runnable() {
@Override
public void run() {
// 任务逻辑
}
}).start();
}
}
public boolean isMainThread() {
return Looper.getMainLooper().getThread() == Thread.currentThread();
}
}

@ -9,6 +9,10 @@ package com.bjzc.zjyxdxj.utils;
*/
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import com.bjzc.zjyxdxj.contans.Contans;
import com.google.gson.Gson;
@ -21,23 +25,31 @@ import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import javax.net.ssl.SSLSocketFactory;
public class MqttSSLPublishServer {
/**
* ip
*/
private final String HOST = "tcp://39.101.173.20:1883";
//private final String HOST = "tcp://39.101.173.20:1883";
private final String HOST = "ssl://39.101.173.20:8883";
//private final String HOST = "tcp://47.242.184.139:8883";
//private final String HOST = "ssl://47.242.184.139:8883";
//private final String HOST = "tcp://113.107.214.27:1883";
/**
*
*/
private final String topicPush = "app_push_yf";
private final String topicPush = "app_push_zy";
/**
*
*/
private final String topicReceive = "app_send";
private final String topicReceive = "member_recall";
/**
* 线
*/
private String clientid = "v1_server_ssl_android";
private String clientid = "v1_server_ssl_android_zy";
private MqttClient client;
private MqttConnectOptions options;
/**
@ -47,6 +59,7 @@ public class MqttSSLPublishServer {
/**
* MQTT
*/
//private final String passWord = "public452131wW452131wW$";
private final String passWord = "public";
/**
*
@ -57,8 +70,7 @@ public class MqttSSLPublishServer {
private int qos = 2;
// 推送消息
private MqttMessage message;
//定时器
private Timer timer;
private Context context;
public MqttSSLPublishServer(Context context) {
@ -66,8 +78,7 @@ public class MqttSSLPublishServer {
// host为主机名clientid即连接MQTT的客户端ID一般以唯一标识符表示MemoryPersistence设置clientid的保存形式默认为以内存保存
try {
clientid=(String) SPUtils.get(context,"clientid",String.valueOf(""));
if(clientid!=null&&clientid.equals("")){
if(TextUtils.isEmpty(clientid)){
clientid=UUID.randomUUID().toString();
SPUtils.put(context,"clientid",clientid);
}
@ -76,7 +87,7 @@ public class MqttSSLPublishServer {
// MQTT的连接设置
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
options.setCleanSession(false);
// 设置连接的用户名
options.setUserName(userName);
// 设置连接的密码
@ -85,8 +96,17 @@ public class MqttSSLPublishServer {
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//断线重连
options.setAutomaticReconnect(true);
// 发布目的消息对象
message = new MqttMessage();
//mqtt服务器端单向加密
// SSLSocketFactory socketFactory = MqttSSLSocketFactory.getSingleSocketFactory(context);
// options.setSocketFactory(socketFactory);
//mqtt服务器端单双向加密
SSLSocketFactory socketFactory = MqttSSLSocketFactory.getTwoDirSocketFactory(" ",context);
options.setSocketFactory(socketFactory);
// 设置回调
client.setCallback(new MqttCallbackExtended() {
@ -101,13 +121,20 @@ public class MqttSSLPublishServer {
}
public void connectionLost(Throwable cause) {
stop();//关闭
//断线后,重新连接
try {
client.reconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
public void messageArrived(String topic, MqttMessage message) throws Exception {
// String messageDe = RSAAndroid.decryptByPublicKeyForSpiltStr(new String(message.getPayload()), RSAAndroid.publicRsaKey);
// System.out.println("message content:"+messageDe);
// System.out.println("***** get message end *****");
//收到招回指令
String callbackStr = new String(message.getPayload());
if(callbackStr.length()>0){
Log.i("app",callbackStr);
}
}
public void deliveryComplete(IMqttDeliveryToken token) {
@ -120,28 +147,29 @@ public class MqttSSLPublishServer {
public void start() {
try {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
message.setQos(qos);
message.setRetained(true);
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String username = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
String password = (String) SPUtils.get(context,Contans.USERPWD,String.valueOf(""));
String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
String passwordTemp = (String) SPUtils.get(context,Contans.USERPWD,String.valueOf(""));
String username =RSAUtils.decryptBASE64StrLocal(usernameTemp);
String password = RSAUtils.decryptBASE64StrLocal(passwordTemp);
String nfc = (String) SPUtils.get(context,Contans.NFCBM,String.valueOf(""));
HashMap<String, String> mapPush = new HashMap<>();
mapPush.put("username",username);
mapPush.put("password",password);
mapPush.put("date",sd.format(new Date()));
mapPush.put("appversion", getVersionName());
mapPush.put("nfc",nfc);
Gson gson = new Gson();
try {
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!client.isConnected()) {
// 重新连接
client.connect(options);
// 订阅
client.subscribe(topicReceive,qos);
}
if (client.isConnected()) {//连接成功,跳出连接
// 发布消息
@ -152,20 +180,32 @@ public class MqttSSLPublishServer {
} catch (Exception e1) {
e1.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}, 10000, 120000);
// 设定指定的时间time,此处为10000毫秒
private String getVersionName() {
//1,包管理者对象packageManager
PackageManager pm = this.context.getPackageManager();
//2,从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号),传0代表获取基本信息
try {
PackageInfo packageInfo = pm.getPackageInfo(this.context.getPackageName(), 0);
//3,获取版本名称
return packageInfo.versionName;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void stop() {
public void destroyAll() {
try {
// 断开连接
client.reconnect();
if(client.isConnected()){
client.disconnect();
}
// 关闭客户端
//client.close();
client.close();
} catch (MqttException e) {
e.printStackTrace();
}

@ -0,0 +1,104 @@
package com.bjzc.zjyxdxj.utils;
/**
* Create By HuangWenFei
* 2023-07-26 14:32
*
*/
import android.content.Context;
import com.bjzc.zjyxdxj.R;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import java.io.BufferedInputStream;
import java.io.InputStreamReader;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
public class MqttSSLSocketFactory {
public static SSLSocketFactory getSingleSocketFactory(Context context) {
try {
Security.addProvider(new BouncyCastleProvider());
X509Certificate caCert = null;
BufferedInputStream bis = new BufferedInputStream(context.getResources().openRawResource(R.raw.my_root_ca_single));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
caCert = (X509Certificate) cf.generateCertificate(bis);
}
KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());
caKs.load(null, null);
caKs.setCertificateEntry("cert-certificate", caCert);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(caKs);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static SSLSocketFactory getTwoDirSocketFactory(String password, Context context) {
try {
Security.addProvider(new BouncyCastleProvider());
// load CA certificate
X509Certificate caCert = null;
BufferedInputStream bis = new BufferedInputStream(context.getResources().openRawResource(R.raw.my_root_ca_two_dir));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
caCert = (X509Certificate) cf.generateCertificate(bis);
}
// load client certificate
bis = new BufferedInputStream(context.getResources().openRawResource(R.raw.client));
X509Certificate cert = null;
while (bis.available() > 0) {
cert = (X509Certificate) cf.generateCertificate(bis);
}
// load client private cert
PEMParser pemParser = new PEMParser(new InputStreamReader(context.getResources().openRawResource(R.raw.android_client)));
Object object = pemParser.readObject();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
KeyPair key = converter.getKeyPair((PEMKeyPair) object);
KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());
caKs.load(null, null);
caKs.setCertificateEntry("cert-certificate", caCert);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(caKs);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry("certificate", cert);
ks.setKeyEntry("private-cert", key.getPrivate(), password.toCharArray(),
new java.security.cert.Certificate[]{cert});
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, password.toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAzp+oA9PnQlhI6vCZRe1lfvaVMcuE8rkllgGQ/4IDrTeCPbKJ
1AIK9Em8JDJIUqconh+It/5LXRDTfFwdJt/2pb8ZUn1zg0IQFCHb9+wNZgkPnxxJ
5gRcs4//mppA2ogontTssT2YvxSFJ+roYvG5NhRjOSseOZ7QyGWwz+bvfF8wraVG
+5gYFI7U54fvQ/DMXuQgM3xQCCA66yyoW8b44IA+/m24LooDRrwwzovsXB5eCoXD
8AOynqlV1j3o/2s4beRp4j4wBPaa+5sGNh38dWFVap6So9kRwMK5CqCXFWg1vQ5i
fHzfGPwRsulPJsp86SipezaHFG0euVkJ/zHbGQIDAQABAoIBAHDLNyzfwJ63Exct
wH4r2fw1H7zPHQRjjeEVedIBZ4BnjPGhRRw3AUPZ/JrF2DVGiyXGkRvf9cQYK1r3
7fIK0NoqN+iQEz7UEXLsCOiOM8I/sAdrqeum9fQP57i9/ClPqt0J3yviNEAbM5VW
5wUcb77V4lSS9Sz/RXogCSV1K8b4M2DrLP9AIVBgxwuh+zbSAPXoUXvaz54eaFQM
dnnAlvDV7Cv8fM/psWZ3fRkgdPG8p7IUyxAlPPy2Gatgj2w5tptl4gXxzEqXq3W+
m1gum4h6iFXgPzFPxChLW3ol97tTPopkKIqpuxovt0L+C9hZeqrkZYMEvmzM0vBS
ML/h1wECgYEA/1NM/IDhIorYcqsJkUzzkYFtxDeJMwxsyNsEHScXcnjCvizoA7ZO
ZSHrAXHPwFGvwqZ6T9vzZq1gFIgNxjKsnyYaLVxQKtmOmQpXHYyngsVR7E0OtwD2
QZtlsTm1CsCKCCC8Npp0WDghvVK7J5YlN0BlpLeOFxJPPv8ogkJMKDMCgYEAzytq
DURaN9L4ntPI9zRC5hX0Pt+ydWuSbR9Z7Z90VCJEZN6DH4sxE0QfsyLSDa9mo8Hz
qO//QhUZd5As96j1TgYZBiuR1vD86n2O5GCTai5MqDJWdk0j6zjx1zudVoMLGioK
XXcynjTPq/D47MkqZw8faMaPsoQY1papMfhMk4MCgYB7JDnlLmNmvYBXDZa3tV1j
uACwufg53qw40yjQxqHQW93Qyue7opl8vTcSo0mHf949Cv3CtlpWExhbzqKWDKqk
t0O4zOT9RaA4v3v0jHnd4Dz6ss9+A8DBM6mAKEzguqvX77HWw/eI9MmQ/e210fxx
AWYEY2LsTbBaucVXzZHdcQKBgCoMj8v9kao/AgOKzQGP8/wrfJW+ZcR7fw7zDBe1
A7GH+wXWPBsM73sPmreLW8M3VMfsN/6UJ+VLzw17kAT8oD2j8zRTZ5iO9WbK8VPd
Xk5w81I4VWBRq/a0ajHbgcXrdzdqTQxHg1ilM3mcwYmeEyMz6JYlp0j+kuQLVHA2
C6TtAoGADjJv2zCzyiST7bCeeH3e/22oUvK2NkgnOGmq2D7P3pUb4Yf6qadeMd7F
0Nx5jwn4Flu5VMoZvpq4V4bU8O6juQ+TjijlD3fwELMt9aBnrSMLaU6Dsc7KBOVq
r+hp8ONZr6H/qm6mL5ct5w26iy2ydV41tDt757IElNzrHGOOW/c=
-----END RSA PRIVATE KEY-----
Loading…
Cancel
Save