This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git
The following commit(s) were added to refs/heads/master by this push:
new 7d1b65c639 BanyanDB: support TLS connection and configuration. (#12639)
7d1b65c639 is described below
commit 7d1b65c6392c86d30541584d5d0b2ecea45abf8c
Author: Wan Kai <[email protected]>
AuthorDate: Tue Sep 24 16:24:17 2024 +0800
BanyanDB: support TLS connection and configuration. (#12639)
---
.github/workflows/skywalking.yaml | 2 +
.licenserc.yaml | 1 +
docs/en/changes/changes.md | 1 +
docs/en/setup/backend/configuration-vocabulary.md | 4 ++
docs/en/setup/backend/storages/banyandb.md | 2 +
.../src/main/resources/application.yml | 6 +-
.../plugin/banyandb/BanyanDBStorageClient.java | 9 ++-
.../plugin/banyandb/BanyanDBStorageConfig.java | 5 ++
.../plugin/banyandb/BanyanDBStorageProvider.java | 2 +-
.../cases/storage/banyandb/tls/docker-compose.yml | 69 ++++++++++++++++++++++
test/e2e-v2/cases/storage/banyandb/tls/e2e.yaml | 50 ++++++++++++++++
test/e2e-v2/cases/storage/banyandb/tls/tls/ca.crt | 21 +++++++
.../e2e-v2/cases/storage/banyandb/tls/tls/cert.crt | 21 +++++++
.../e2e-v2/cases/storage/banyandb/tls/tls/cert.key | 28 +++++++++
14 files changed, 215 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/skywalking.yaml
b/.github/workflows/skywalking.yaml
index d841f11673..6cf85a0879 100644
--- a/.github/workflows/skywalking.yaml
+++ b/.github/workflows/skywalking.yaml
@@ -359,6 +359,8 @@ jobs:
- name: BanyanDB
config: test/e2e-v2/cases/storage/banyandb/e2e.yaml
+ - name: BanyanDB TLS
+ config: test/e2e-v2/cases/storage/banyandb/tls/e2e.yaml
- name: Storage H2
config: test/e2e-v2/cases/storage/h2/e2e.yaml
- name: Storage MySQL
diff --git a/.licenserc.yaml b/.licenserc.yaml
index cdc8b9d71a..32201e9c53 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -42,6 +42,7 @@ header:
- '**/*.ini'
- '**/*.crt'
- '**/*.pem'
+ - '**/*.key'
- '**/*.txt'
- 'LICENSE'
- 'NOTICE'
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 378b56e607..75644415be 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -70,6 +70,7 @@
* Add Component ID(5022) for the GoFrame framework.
* Bump up protobuf java dependencies to 3.25.5.
* BanyanDB: support using native term searching for `keyword` in query
`findEndpoint` and `getAlarm`.
+* BanyanDB: support TLS connection and configuration.
#### UI
diff --git a/docs/en/setup/backend/configuration-vocabulary.md
b/docs/en/setup/backend/configuration-vocabulary.md
index 20e1889bdd..8d17f2e00c 100644
--- a/docs/en/setup/backend/configuration-vocabulary.md
+++ b/docs/en/setup/backend/configuration-vocabulary.md
@@ -149,6 +149,10 @@ The Configuration Vocabulary lists all available
configurations provided by `app
| - | - | superDatasetShardsFactor
| Shards Factor for a
super dataset record, i.e. Shard number of a super dataset is
recordShardsNumber*superDatasetShardsFactor.
[...]
| - | - | concurrentWriteThreads
| Concurrent consumer
threads for batch writing.
[...]
| - | - | profileTaskQueryMaxSize
| Max size of ProfileTask
to be fetched.
[...]
+| - | - | segmentIntervalDays
| Data is stored in
BanyanDB in segments. A segment is a time range of data.The segment interval is
the time range of a segment.The value should be less or equal to data TTL
relevant settings.
[...]
+| - | - | superDatasetSegmentIntervalDays
| The super dataset
segment interval is the time range of a segment in the super dataset.
[...]
+| - | - | specificGroupSettings
| Specific groups
settings.
[...]
+| - | - | sslTrustCAPath
| If the BanyanDB server
is configured with TLS, config the TLS cert file path and open tls connection.
[...]
| agent-analyzer | default | Agent Analyzer.
| SW_AGENT_ANALYZER
[...]
| - | - | traceSamplingPolicySettingsFile
| The sampling policy
including `sampling rate` and `the threshold of trace segment latency` can be
configured by the `traceSamplingPolicySettingsFile` file.
[...]
| - | - | slowDBAccessThreshold
| The slow database
access threshold (in milliseconds).
[...]
diff --git a/docs/en/setup/backend/storages/banyandb.md
b/docs/en/setup/backend/storages/banyandb.md
index 4cd02e30c7..29b98b2fa4 100644
--- a/docs/en/setup/backend/storages/banyandb.md
+++ b/docs/en/setup/backend/storages/banyandb.md
@@ -49,6 +49,8 @@ storage:
# Please refer to
https://github.com/apache/skywalking-banyandb/blob/${BANYANDB_RELEASE}/docs/crud/group.md#create-operation
# for group setting details.
specificGroupSettings: ${SW_STORAGE_BANYANDB_SPECIFIC_GROUP_SETTINGS:""}
+ # If the BanyanDB server is configured with TLS, config the TLS cert file
path and open tls connection.
+ sslTrustCAPath: ${SW_STORAGE_BANYANDB_SSL_TRUST_CA_PATH:""}
```
BanyanDB Server supports two installation modes: standalone and cluster. The
standalone mode is suitable for small-scale deployments, while the cluster mode
is suitable for large-scale deployments.
diff --git a/oap-server/server-starter/src/main/resources/application.yml
b/oap-server/server-starter/src/main/resources/application.yml
index 33c1607038..aadaaeb3d6 100644
--- a/oap-server/server-starter/src/main/resources/application.yml
+++ b/oap-server/server-starter/src/main/resources/application.yml
@@ -220,7 +220,7 @@ storage:
# Targets is the list of BanyanDB servers, separated by commas.
# Each target is a BanyanDB server in the format of `host:port`
# The host is the IP address or domain name of the BanyanDB server, and
the port is the port number of the BanyanDB server.
- targets: ${SW_STORAGE_BANYANDB_TARGETS:127.0.0.1:17912}
+ targets: ${SW_STORAGE_BANYANDB_TARGETS:localhost:17912}
# The max number of records in a bulk write request.
# Bigger value can improve the write performance, but also increase the
OAP and BanyanDB Server memory usage.
maxBulkSize: ${SW_STORAGE_BANYANDB_MAX_BULK_SIZE:10000}
@@ -254,9 +254,11 @@ storage:
superDatasetSegmentIntervalDays:
${SW_STORAGE_BANYANDB_SUPER_DATASET_SEGMENT_INTERVAL_DAYS:1}
# Specific groups settings.
# For example, {"group1": {"blockIntervalHours": 4, "segmentIntervalDays":
1}}
- # Please refer to
https://github.com/apache/skywalking-banyandb/blob/${BANYANDB_RELEASE}/docs/crud/group.md#create-operation
+ # Please refer to
https://github.com/apache/skywalking-banyandb/blob/${BANYANDB_RELEASE}/docs/interacting/bydbctl/schema/group.md#create-operation
# for group setting details.
specificGroupSettings: ${SW_STORAGE_BANYANDB_SPECIFIC_GROUP_SETTINGS:""}
+ # If the BanyanDB server is configured with TLS, config the TLS cert file
path and open tls connection.
+ sslTrustCAPath: ${SW_STORAGE_BANYANDB_SSL_TRUST_CA_PATH:""}
agent-analyzer:
selector: ${SW_AGENT_ANALYZER:default}
diff --git
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java
index 35ce37194e..30e4c63b9e 100644
---
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java
+++
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java
@@ -25,6 +25,7 @@ import
org.apache.skywalking.banyandb.v1.client.MeasureBulkWriteProcessor;
import org.apache.skywalking.banyandb.v1.client.MeasureQuery;
import org.apache.skywalking.banyandb.v1.client.MeasureQueryResponse;
import org.apache.skywalking.banyandb.v1.client.MeasureWrite;
+import org.apache.skywalking.banyandb.v1.client.Options;
import org.apache.skywalking.banyandb.v1.client.StreamBulkWriteProcessor;
import org.apache.skywalking.banyandb.v1.client.StreamQuery;
import org.apache.skywalking.banyandb.v1.client.StreamQueryResponse;
@@ -58,9 +59,11 @@ public class BanyanDBStorageClient implements Client,
HealthCheckable {
private final DelegatedHealthChecker healthChecker = new
DelegatedHealthChecker();
private final int flushTimeout;
- public BanyanDBStorageClient(int flushTimeout, String... targets) {
- this.client = new BanyanDBClient(targets);
- this.flushTimeout = flushTimeout;
+ public BanyanDBStorageClient(BanyanDBStorageConfig config) {
+ Options options = new Options();
+ options.setSslTrustCAPath(config.getSslTrustCAPath());
+ this.client = new BanyanDBClient(config.getTargetArray(), options);
+ this.flushTimeout = config.getFlushTimeout();
}
@Override
diff --git
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageConfig.java
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageConfig.java
index 793e5ada1f..f466885e98 100644
---
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageConfig.java
+++
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageConfig.java
@@ -93,6 +93,11 @@ public class BanyanDBStorageConfig extends ModuleConfig {
*/
private String specificGroupSettings;
+ /**
+ * If the BanyanDB server is configured with TLS, config the TLS cert file
path and open tls connection.
+ */
+ private String sslTrustCAPath = "";
+
public String[] getTargetArray() {
return
Iterables.toArray(Splitter.on(",").omitEmptyStrings().trimResults().split(this.targets),
String.class);
}
diff --git
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java
index e7660921b3..0380a2dfd4 100644
---
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java
+++
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java
@@ -117,7 +117,7 @@ public class BanyanDBStorageProvider extends ModuleProvider
{
public void prepare() throws ServiceNotProvidedException,
ModuleStartException {
this.registerServiceImplementation(StorageBuilderFactory.class, new
StorageBuilderFactory.Default());
- this.client = new BanyanDBStorageClient(config.getFlushTimeout(),
config.getTargetArray());
+ this.client = new BanyanDBStorageClient(config);
this.modelInstaller = new BanyanDBIndexInstaller(client, getManager(),
this.config);
// Stream
diff --git a/test/e2e-v2/cases/storage/banyandb/tls/docker-compose.yml
b/test/e2e-v2/cases/storage/banyandb/tls/docker-compose.yml
new file mode 100644
index 0000000000..75f4c6fcc5
--- /dev/null
+++ b/test/e2e-v2/cases/storage/banyandb/tls/docker-compose.yml
@@ -0,0 +1,69 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+version: '2.1'
+
+services:
+ banyandb:
+ extends:
+ file: ../../../../script/docker-compose/base-compose.yml
+ service: banyandb
+ volumes:
+ - ./tls:/tls
+ command: standalone --stream-root-path /tmp/stream-data
--measure-root-path /tmp/measure-data --tls=true --key-file=/tls/cert.key
--cert-file=/tls/cert.crt --http-grpc-cert-file=/tls/ca.crt
+ networks:
+ - e2e
+
+ oap:
+ extends:
+ file: ../../../../script/docker-compose/base-compose.yml
+ service: oap
+ volumes:
+ - ./tls/cert.crt:/tls/cert.crt
+ environment:
+ SW_STORAGE: banyandb
+ SW_STORAGE_BANYANDB_SSL_TRUST_CA_PATH: /tls/cert.crt
+ ports:
+ - 12800
+ depends_on:
+ banyandb:
+ condition: service_healthy
+
+ provider:
+ extends:
+ file: ../../../../script/docker-compose/base-compose.yml
+ service: provider
+ ports:
+ - 9090
+ networks:
+ - e2e
+ depends_on:
+ oap:
+ condition: service_healthy
+
+ consumer:
+ extends:
+ file: ../../../../script/docker-compose/base-compose.yml
+ service: consumer
+ ports:
+ - 9092
+ depends_on:
+ oap:
+ condition: service_healthy
+ provider:
+ condition: service_healthy
+
+networks:
+ e2e:
diff --git a/test/e2e-v2/cases/storage/banyandb/tls/e2e.yaml
b/test/e2e-v2/cases/storage/banyandb/tls/e2e.yaml
new file mode 100644
index 0000000000..93dd16f867
--- /dev/null
+++ b/test/e2e-v2/cases/storage/banyandb/tls/e2e.yaml
@@ -0,0 +1,50 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file is used to show how to write configuration files and can be used
to test.
+
+setup:
+ env: compose
+ file: docker-compose.yml
+ timeout: 20m
+ init-system-environment: ../../../../script/env
+ steps:
+ - name: set PATH
+ command: export PATH=/tmp/skywalking-infra-e2e/bin:$PATH
+ - name: install yq
+ command: bash test/e2e-v2/script/prepare/setup-e2e-shell/install.sh yq
+ - name: install swctl
+ command: bash test/e2e-v2/script/prepare/setup-e2e-shell/install.sh swctl
+
+trigger:
+ action: http
+ interval: 5s
+ times: 40
+ url: http://${consumer_host}:${consumer_9092}/users
+ method: POST
+ body: '{"id":"123","name":"skywalking"}'
+ headers:
+ "Content-Type": "application/json"
+
+verify:
+ # verify with retry strategy
+ retry:
+ # max retry count
+ count: 20
+ # the interval between two retries, in millisecond.
+ interval: 10s
+ cases:
+ - includes:
+ - ../../storage-cases.yaml
diff --git a/test/e2e-v2/cases/storage/banyandb/tls/tls/ca.crt
b/test/e2e-v2/cases/storage/banyandb/tls/tls/ca.crt
new file mode 100644
index 0000000000..a75fd56f1e
--- /dev/null
+++ b/test/e2e-v2/cases/storage/banyandb/tls/tls/ca.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDYzCCAkugAwIBAgIUAJ+VBTfduocXTnjwAAt5/xLcuhcwDQYJKoZIhvcNAQEL
+BQAwQDELMAkGA1UEBhMCQ04xDTALBgNVBAgMBFRlc3QxDTALBgNVBAcMBFRlc3Qx
+EzARBgNVBAoMClNreVdhbGtpbmcwIBcNMjQwOTE5MDIxNjEzWhgPMjEyNDA4MjYw
+MjE2MTNaMEAxCzAJBgNVBAYTAkNOMQ0wCwYDVQQIDARUZXN0MQ0wCwYDVQQHDARU
+ZXN0MRMwEQYDVQQKDApTa3lXYWxraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy1DBH5bTwGj+hGewLPJZ/wFAlsi2oWH01vlJSIXHLoFm/vNPh1/5
+psCSr08KJT+h445b5TEphOgK/83NhRKlWPjhUL+MfqnQ4VES+iFIpxvUNcwxWosS
+Ky2U2it000kiuX9dPC2eR5tC7AmU0/TrON9ZBLzzsAlDPgTA63BSdH3NUqgy/w/7
+r6gpiXwsjMKTdB/S2PQ+ojwR0xgqmiDI2GiA7nTTo9AE+gkMx3EUS6BF6Dn8Vrxf
+F0UNjwVGzL15S5VaD3nn1ky5RO++D3ie+8dfUTjwnmEOJPf6jLdZPI/bsI+mGZOQ
+kmcp67ojMsmbI8mca4fh9KrLMmFaFVekDwIDAQABo1MwUTAdBgNVHQ4EFgQUQrK4
+dKKuvLwTSfoWE/fmgX25nj0wHwYDVR0jBBgwFoAUQrK4dKKuvLwTSfoWE/fmgX25
+nj0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAqOVwBk53gZfM
+SndGoQxZgMM6jTlsKSCkxvdzjuNKYqa5SGEWwevlEXkC+cNgt2biAzVSUQhYPSle
+I6LrGhTvWQia0lEcjto5flAzg+2oqKVb+i5RULpFvmiGSvB5+CDitthAIRDx3z2Y
+UhRlSL8Fx371jn9/wHPjsYbR0wgfYWZkFa+uF7YEKmidzcAdvXgFVX6I2/rztfMZ
+3SClJqL5/fEfQM6V4lBpQI63XVZlIEJuSu9ce5SwdIfNT0Hj2JbZilpuICRuScDw
+O19AERTKp2Y+fGZNmBHdPdG3yIXPRiCilZLd3wRBaV3uTUoAMldZt53txWUk5PQu
+P6rokRsE1g==
+-----END CERTIFICATE-----
diff --git a/test/e2e-v2/cases/storage/banyandb/tls/tls/cert.crt
b/test/e2e-v2/cases/storage/banyandb/tls/tls/cert.crt
new file mode 100644
index 0000000000..777d21b903
--- /dev/null
+++ b/test/e2e-v2/cases/storage/banyandb/tls/tls/cert.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDejCCAmKgAwIBAgIUX+aT7K4RC+yPZZgycUYzVjGjym0wDQYJKoZIhvcNAQEL
+BQAwQDELMAkGA1UEBhMCQ04xDTALBgNVBAgMBFRlc3QxDTALBgNVBAcMBFRlc3Qx
+EzARBgNVBAoMClNreVdhbGtpbmcwIBcNMjQwOTE5MDIxNjEzWhgPMjEyNDA4MjYw
+MjE2MTNaMFMxCzAJBgNVBAYTAkNOMQ0wCwYDVQQIDARUZXN0MQ0wCwYDVQQHDARU
+ZXN0MRMwEQYDVQQKDApTa3lXYWxraW5nMREwDwYDVQQDDAhiYW55YW5kYjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJT3AVIUrW5hHbvK5UHNUhudBM2P
+BaDDKmhzdnG0jNRbfbzRnSc5/E733bAtOHp+q1yCmeLlOiIuN7Kzw7JRGrps3UwA
+4a5dC8T64QabGJec0uKSQ8OSTxxlX5cKwMvbS3oukgBztwrXZdgFUHmLhT7E274I
+w8qpoqGSU003DQxyLQi4NxKuzXvUUlGLLfOjvf3DUN6HcoY2pmiRg+yRmJ0CcDYI
+iNTLUnZ++Ev+DLYoz2fn/POhUzb3QaqXd9og07GjR1g55O7TuhDQNGYZ1ugrU3wG
+8LwQfRBGyLVgF9sCmOoJwwxAePifqDhK+qjG2nlCdaS+EyNODTauJBy7GoUCAwEA
+AaNXMFUwEwYDVR0RBAwwCoIIYmFueWFuZGIwHQYDVR0OBBYEFBfAaFUvCKWlx/av
+SfdJztGCGendMB8GA1UdIwQYMBaAFEKyuHSirry8E0n6FhP35oF9uZ49MA0GCSqG
+SIb3DQEBCwUAA4IBAQBbY7Q8TVTRnhr+mx8eeaKtubz8IqPoKxURTuYRiDWXmIq0
+tYSE/ZAuaXXA1yCDAa4QVqu2JnMl4V/RN4ekdGjOo3baPUAeINhB/gBPVNs7Ek5B
+RmRLs+quPfl7YraTGMAC2ykr6GTB2v7eW9OEoriND8ien14SdqKuf87lFRAHmuAG
+3lFQqMdlGPS3PbxcDlcfcgsXi6FevINUBXl7Q2cMcFiXiyG0C1w2oA0Q611O6rZv
+7yov42kAWnQiuN3HtLQKhG296V66zla5j9oE2NmTqM4b3/wyBNCEedIPGumcrdMU
+ICdzwef06UIRHpaV39+P4dJZWE8whj5p3GGMGw1a
+-----END CERTIFICATE-----
diff --git a/test/e2e-v2/cases/storage/banyandb/tls/tls/cert.key
b/test/e2e-v2/cases/storage/banyandb/tls/tls/cert.key
new file mode 100644
index 0000000000..fed9173a4c
--- /dev/null
+++ b/test/e2e-v2/cases/storage/banyandb/tls/tls/cert.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCU9wFSFK1uYR27
+yuVBzVIbnQTNjwWgwypoc3ZxtIzUW3280Z0nOfxO992wLTh6fqtcgpni5ToiLjey
+s8OyURq6bN1MAOGuXQvE+uEGmxiXnNLikkPDkk8cZV+XCsDL20t6LpIAc7cK12XY
+BVB5i4U+xNu+CMPKqaKhklNNNw0Mci0IuDcSrs171FJRiy3zo739w1Deh3KGNqZo
+kYPskZidAnA2CIjUy1J2fvhL/gy2KM9n5/zzoVM290Gql3faINOxo0dYOeTu07oQ
+0DRmGdboK1N8BvC8EH0QRsi1YBfbApjqCcMMQHj4n6g4Svqoxtp5QnWkvhMjTg02
+riQcuxqFAgMBAAECggEAAK+QJEd0Fzu2p1RjOc7l5CheCwHv1vtYLX5almJHjNdM
+s7+McIZc9UlBIJem/TKFzkvLoG2ABLqNK6oDoTMZ0PjBnlf0+yrN7DWpLvoH0Krf
+BIdw/0fIlXRPvFkinF/vOQVZS0vPXjREOp7wNsObYpMqAhqIOe/E2QvcjSwqkO08
++3Pd6LQy8VnF50nLsagPDbTrvdaSZZOxEwK0RtojHp3TqYt9wzDhFo3IBeQOp2FW
+MCesOHgDQ5lSMUo4FazQmC2MaGf1hlCpIoZ0TyIlavpyqKE4aRNtUrCZFk0BLSbQ
+DjIVkSCpNEuTy9D8PpafXQ4M15+Qs/2mKmQRhq21AQKBgQDG58Wg8a9+Nr+4e0fK
+B/qdPjvoSgVMceFF/zQ8ABeK0IEfmaywNAedDUc5X8Rav+l1cbNHdywZbB5nqZL4
+wWeZTcsC4lh9LDC7a/IIubBipOgWwOSPE1CQh05iUgFXWzfxWdhLptZGf1G75BD3
+Ow4ye/5QinLeOovUh3GRCw8IDwKBgQC/uXB2ISXpl2HW/z7rqHn64vHQ5+D6zTpm
+XHYgyPlZw/HOPBt21kfV5FvcxtLuE1iv+AVcJ2lUyd2idIwOs5jBykTcf8BAf1Py
+Pm20ghYTyyJVRWsyIpWlZ9NBgRxJVhqZneSTs4ZHexDBNQSg4Zd8JE8kKuruA15z
+zVdPxL9AKwKBgQCWEB6GAlFIg725TSkoP0TQhTdlVRMSTYiL6rJZ4ifgztXcJXCn
+r1lfH7lwi9P0M33K4XFEpaBbvbpiswjzK9chThOvpVzlcwWBITuFYbK1eXywTe8i
+EoxhvfNhMkVYxrU6HXKWANUAcuYTP0mdfKyFYg7IbOukxb7hJR6FMzav+QKBgGst
+4qXXQBeG7kY/qNAa/h34EtEDX+01H6mrlModL/AzrxDo3z2e6sezAnu4lqBLJnAx
+CeYLjkG9G+6+krGBSytCxR4zOKmVxLsOlUus0WS9UXMz/IopdVjjYuEiqUqCHRq1
+ftvnJ3D8ZlBsMCs0EfhvX+LLL0xhi8LXDzFjvrrDAoGAWSW09H4jgiFGzTfZwUEF
+Ra/375b9ajI9Uy27Do+jyU0jfVGsC+K46w+U989Told2adFj89dTcjochRcv0U2w
+M+TN3od1Sb3XzJF2+bOkhQqyoq1VzG5AcbxROu6a+LFg3KQgEfHNJWQbCs4pfa1n
+tI1ZOwddeyXKvOPnAj30kyo=
+-----END PRIVATE KEY-----