Skip to content

Commit 3e2da3c

Browse files
authored
Enable SSL in reindex with security QA tests (#38293)
Update the x-pack/qa/reindex-tests-with-security integration tests to run with TLS enabled on the Rest interface. Backport of: #37600 Relates: #37527
1 parent 448acaf commit 3e2da3c

File tree

10 files changed

+240
-19
lines changed

10 files changed

+240
-19
lines changed

test/framework/src/main/java/org/elasticsearch/test/rest/ESRestTestCase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,8 @@ protected static void configureClient(RestClientBuilder builder, Settings settin
709709
throw new IllegalStateException(TRUSTSTORE_PATH + " is set but points to a non-existing file");
710710
}
711711
try {
712-
KeyStore keyStore = KeyStore.getInstance("jks");
712+
final String keyStoreType = keystorePath.endsWith(".p12") ? "PKCS12" : "jks";
713+
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
713714
try (InputStream is = Files.newInputStream(path)) {
714715
keyStore.load(is, keystorePass.toCharArray());
715716
}

x-pack/qa/reindex-tests-with-security/build.gradle

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
import javax.net.ssl.HttpsURLConnection
2+
import javax.net.ssl.KeyManager
3+
import javax.net.ssl.SSLContext
4+
import javax.net.ssl.TrustManagerFactory
5+
import java.nio.charset.StandardCharsets
6+
import java.security.KeyStore
7+
import java.security.SecureRandom
8+
19
apply plugin: 'elasticsearch.standalone-rest-test'
210
apply plugin: 'elasticsearch.rest-test'
311

@@ -9,13 +17,31 @@ dependencies {
917
testCompile project(path: ':modules:reindex')
1018
}
1119

20+
forbiddenPatterns {
21+
exclude '**/*.key'
22+
exclude '**/*.pem'
23+
exclude '**/*.p12'
24+
exclude '**/*.jks'
25+
}
26+
27+
File caFile = project.file('src/test/resources/ssl/ca.p12')
28+
1229
integTestCluster {
1330
// Whitelist reindexing from the local node so we can test it.
31+
extraConfigFile 'http.key', project.projectDir.toPath().resolve('src/test/resources/ssl/http.key')
32+
extraConfigFile 'http.crt', project.projectDir.toPath().resolve('src/test/resources/ssl/http.crt')
33+
extraConfigFile 'ca.p12', caFile
1434
setting 'reindex.remote.whitelist', '127.0.0.1:*'
1535
setting 'xpack.ilm.enabled', 'false'
1636
setting 'xpack.security.enabled', 'true'
1737
setting 'xpack.ml.enabled', 'false'
1838
setting 'xpack.license.self_generated.type', 'trial'
39+
setting 'xpack.security.http.ssl.enabled', 'true'
40+
setting 'xpack.security.http.ssl.certificate', 'http.crt'
41+
setting 'xpack.security.http.ssl.key', 'http.key'
42+
setting 'xpack.security.http.ssl.key_passphrase', 'http-password'
43+
setting 'reindex.ssl.truststore.path', 'ca.p12'
44+
setting 'reindex.ssl.truststore.password', 'password'
1945
extraConfigFile 'roles.yml', 'roles.yml'
2046
[
2147
test_admin: 'superuser',
@@ -31,13 +57,48 @@ integTestCluster {
3157
'bin/elasticsearch-users', 'useradd', user, '-p', 'x-pack-test-password', '-r', role
3258
}
3359
waitCondition = { node, ant ->
34-
File tmpFile = new File(node.cwd, 'wait.success')
35-
ant.get(src: "http://${node.httpUri()}/_cluster/health?wait_for_nodes=>=${numNodes}&wait_for_status=yellow",
36-
dest: tmpFile.toString(),
37-
username: 'test_admin',
38-
password: 'x-pack-test-password',
39-
ignoreerrors: true,
40-
retries: 10)
41-
return tmpFile.exists()
60+
// Load the CA PKCS#12 file as a truststore
61+
KeyStore ks = KeyStore.getInstance("PKCS12");
62+
ks.load(caFile.newInputStream(), 'password'.toCharArray());
63+
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
64+
tmf.init(ks);
65+
66+
// Configre a SSL context for TLS1.2 using our CA trust manager
67+
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
68+
sslContext.init(new KeyManager[0], tmf.getTrustManagers(), new SecureRandom());
69+
70+
// Check whether the cluster has started
71+
URL url = new URL("https://${node.httpUri()}/_cluster/health?wait_for_nodes=${numNodes}&wait_for_status=yellow");
72+
for (int i = 20; i >= 0; i--) {
73+
// we use custom wait logic here for HTTPS
74+
HttpsURLConnection httpURLConnection = null;
75+
try {
76+
logger.info("Trying ${url}");
77+
httpURLConnection = (HttpsURLConnection) url.openConnection();
78+
httpURLConnection.setSSLSocketFactory(sslContext.getSocketFactory());
79+
httpURLConnection.setRequestProperty("Authorization",
80+
"Basic " + Base64.getEncoder().encodeToString("test_admin:x-pack-test-password".getBytes(StandardCharsets.UTF_8)));
81+
httpURLConnection.setRequestMethod("GET");
82+
httpURLConnection.connect();
83+
if (httpURLConnection.getResponseCode() == 200) {
84+
logger.info("Cluster has started");
85+
return true;
86+
} else {
87+
logger.debug("HTTP response was [{}]", httpURLConnection.getResponseCode());
88+
}
89+
} catch (IOException e) {
90+
if (i == 0) {
91+
logger.error("Failed to call cluster health - " + e)
92+
}
93+
logger.debug("Call to [{}] threw an exception", url, e)
94+
} finally {
95+
if (httpURLConnection != null) {
96+
httpURLConnection.disconnect();
97+
}
98+
}
99+
// did not start, so wait a bit before trying again
100+
Thread.sleep(750L);
101+
}
102+
return false;
42103
}
43104
}

x-pack/qa/reindex-tests-with-security/src/test/java/org/elasticsearch/xpack/security/ReindexWithSecurityClientYamlTestSuiteIT.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,27 @@
77

88
import com.carrotsearch.randomizedtesting.annotations.Name;
99
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
10-
10+
import org.elasticsearch.common.io.PathUtils;
1111
import org.elasticsearch.common.settings.SecureString;
1212
import org.elasticsearch.common.settings.Settings;
1313
import org.elasticsearch.common.util.concurrent.ThreadContext;
1414
import org.elasticsearch.test.rest.yaml.ClientYamlTestCandidate;
1515
import org.elasticsearch.test.rest.yaml.ESClientYamlSuiteTestCase;
16+
import org.junit.AfterClass;
17+
import org.junit.BeforeClass;
18+
19+
import java.io.FileNotFoundException;
20+
import java.net.URL;
21+
import java.nio.file.Path;
1622

1723
import static org.elasticsearch.xpack.core.security.authc.support.UsernamePasswordToken.basicAuthHeaderValue;
1824

1925
public class ReindexWithSecurityClientYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
2026
private static final String USER = "test_admin";
2127
private static final String PASS = "x-pack-test-password";
2228

29+
private static Path httpTrustStore;
30+
2331
public ReindexWithSecurityClientYamlTestSuiteIT(@Name("yaml") ClientYamlTestCandidate testCandidate) {
2432
super(testCandidate);
2533
}
@@ -29,6 +37,25 @@ public static Iterable<Object[]> parameters() throws Exception {
2937
return ESClientYamlSuiteTestCase.createParameters();
3038
}
3139

40+
@BeforeClass
41+
public static void findTrustStore( ) throws Exception {
42+
final URL resource = ReindexWithSecurityClientYamlTestSuiteIT.class.getResource("/ssl/ca.p12");
43+
if (resource == null) {
44+
throw new FileNotFoundException("Cannot find classpath resource /ssl/ca.p12");
45+
}
46+
httpTrustStore = PathUtils.get(resource.toURI());
47+
}
48+
49+
@AfterClass
50+
public static void cleanupStatics() {
51+
httpTrustStore = null;
52+
}
53+
54+
@Override
55+
protected String getProtocol() {
56+
return "https";
57+
}
58+
3259
/**
3360
* All tests run as a an administrative user but use <code>es-security-runas-user</code> to become a less privileged user.
3461
*/
@@ -37,6 +64,8 @@ protected Settings restClientSettings() {
3764
String token = basicAuthHeaderValue(USER, new SecureString(PASS.toCharArray()));
3865
return Settings.builder()
3966
.put(ThreadContext.PREFIX + ".Authorization", token)
67+
.put(TRUSTSTORE_PATH , httpTrustStore)
68+
.put(TRUSTSTORE_PASSWORD, "password")
4069
.build();
4170
}
4271
}

x-pack/qa/reindex-tests-with-security/src/test/resources/rest-api-spec/test/15_reindex_from_remote.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
body:
2727
source:
2828
remote:
29-
host: http://${host}
29+
host: https://${host}
3030
username: test_admin
3131
password: x-pack-test-password
3232
index: source
@@ -63,7 +63,7 @@
6363
body:
6464
source:
6565
remote:
66-
host: http://${host}
66+
host: https://${host}
6767
username: minimal_user
6868
password: x-pack-test-password
6969
index: source
@@ -109,7 +109,7 @@
109109
body:
110110
source:
111111
remote:
112-
host: http://${host}
112+
host: https://${host}
113113
username: readonly_user
114114
password: x-pack-test-password
115115
index: source
@@ -154,7 +154,7 @@
154154
body:
155155
source:
156156
remote:
157-
host: http://${host}
157+
host: https://${host}
158158
username: dest_only_user
159159
password: x-pack-test-password
160160
index: source
@@ -196,7 +196,7 @@
196196
body:
197197
source:
198198
remote:
199-
host: http://${host}
199+
host: https://${host}
200200
username: test_admin
201201
password: x-pack-test-password
202202
index: source
@@ -255,7 +255,7 @@
255255
body:
256256
source:
257257
remote:
258-
host: http://${host}
258+
host: https://${host}
259259
username: can_not_see_hidden_docs_user
260260
password: x-pack-test-password
261261
index: source
@@ -312,7 +312,7 @@
312312
body:
313313
source:
314314
remote:
315-
host: http://${host}
315+
host: https://${host}
316316
username: can_not_see_hidden_fields_user
317317
password: x-pack-test-password
318318
index: source
@@ -377,7 +377,7 @@
377377
body:
378378
source:
379379
remote:
380-
host: http://${host}
380+
host: https://${host}
381381
username: test_admin
382382
password: badpass
383383
index: source
@@ -413,7 +413,7 @@
413413
body:
414414
source:
415415
remote:
416-
host: http://${host}
416+
host: https://${host}
417417
index: source
418418
dest:
419419
index: dest
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
= Keystore Details
2+
This document details the steps used to create the certificate and keystore files in this directory.
3+
4+
== Instructions on generating certificates
5+
The certificates in this directory have been generated using elasticsearch-certutil (7.0.0 SNAPSHOT)
6+
7+
[source,shell]
8+
-----------------------------------------------------------------------------------------------------------
9+
elasticsearch-certutil ca --pem --out=ca.zip --pass="ca-password" --days=3500
10+
unzip ca.zip
11+
mv ca/ca.* ./
12+
-----------------------------------------------------------------------------------------------------------
13+
14+
[source,shell]
15+
-----------------------------------------------------------------------------------------------------------
16+
elasticsearch-certutil cert --pem --name=http --out=http.zip --pass="http-password" --days=3500 \
17+
--ca-cert=ca.crt --ca-key=ca.key --ca-pass="ca-password" \
18+
--dns=localhost --dns=localhost.localdomain --dns=localhost4 --dns=localhost4.localdomain4 --dns=localhost6 --dns=localhost6.localdomain6 \
19+
--ip=127.0.0.1 --ip=0:0:0:0:0:0:0:1
20+
21+
unzip http.zip
22+
mv http/http.* ./
23+
-----------------------------------------------------------------------------------------------------------
24+
25+
[source,shell]
26+
-----------------------------------------------------------------------------------------------------------
27+
keytool -importcert -file ca.crt -keystore ca.p12 -storetype PKCS12 -storepass "password" -alias ca
28+
-----------------------------------------------------------------------------------------------------------
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDSjCCAjKgAwIBAgIVAMp4ojQbvgxx3HBRFHadTvCjFn1+MA0GCSqGSIb3DQEB
3+
CwUAMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlmaWNhdGUgVG9vbCBBdXRvZ2Vu
4+
ZXJhdGVkIENBMB4XDTE4MTIxMzA2MDU0OVoXDTI4MDcxMzA2MDU0OVowNDEyMDAG
5+
A1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5lcmF0ZWQgQ0Ew
6+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCDtMpBiqR2EaLHC8jNojf9
7+
G4xlqFYj+pLzQidPHQlmqEDYYpSUmSVxh2GT7f6VQ7acdlFecSIfbvngGE94aBFB
8+
sSQwzrjk0Bgq3+31nQDdM9DwHPQxYWdq20mxs0qztfpV0BfzsS4hdTHVK3ZvtaN8
9+
D+FTTvugM/e/PZxEXa2yFVt7GfCe2mF6DLvJpm86Eeyfr9HPZc6QK2vKaNkeaFSr
10+
WFyovb8ivLb6yGMQva/fnQRAJNLZi0YnsMwUhn/Xe1MyfeRyLmkLvF+Q3XwiYInt
11+
0721DMUH4VYaQ2EV76g3v0mxvbCdHMCRVudvlqiO3y4AXyq9RDJ5f3AZIEX8aBAr
12+
AgMBAAGjUzBRMB0GA1UdDgQWBBTln4o7tJW/VyYSNJXbgrYYnIR3czAfBgNVHSME
13+
GDAWgBTln4o7tJW/VyYSNJXbgrYYnIR3czAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
14+
SIb3DQEBCwUAA4IBAQB8AzUs0DIVmuasZoN5ftBOzNB2XUHI3p95Yju3lF+9E0i4
15+
ZyAjqcQoNaDSHrd9bzhmQuLiPmN+dPEwGNhlg5ddclthfwY4qy+IxoIUM6L/vFlF
16+
ApPx+XZK3zZtv/kXqjz8ZWA8Qj4BVWOo3XK4HodJkoMDIkhWPQXlA8BEJDNUnirl
17+
8HTlibnihKvzGmZHEWvgm6YrUyS4YknUvafROW/EUm4Gl4zniFuLG8VVN/2dbJmy
18+
v2xMsqji8Pf+2ZnZ/aXS0bg4hzGyPBljoifEI7lj0twg5zpEXeCZJ7BgsoFicgve
19+
iYZV9yrDBHognEbFAIywiK3+GXrqAkvB/OQiGCTM
20+
-----END CERTIFICATE-----
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: DES-EDE3-CBC,2DF8E98BAAF74EB5
4+
5+
Y5r4e8s5XV7aUr12V0PSfr1+67J+Ao6fAG0fjxM0M7Qv3IIghS9OdW0YKoWc8h8e
6+
tlJbSrEAnpvopROqCXh860XCdGrDwwTKVEnazgvXb64+CIcVuZXK/HesrBiQIUwz
7+
O/rZKN8HKtM5KTfVqpCtNsCu6TDenkHUEz5uOaG3p3/rvhFtsGp/4PGt5slYt/Z8
8+
g5J0EJeLwRgJaRVR70/3LhmUryZxM4TPMvHjCU7GI4YbXzFzp8qbRSujWr4/l5qm
9+
4Piid3pyxN1L47TviB6jRWt7XZrOcvr7Glqjuz0ak9beUyidL3QUJAgZGQD9O6zj
10+
iPaGI/9AF01fAo9J8N7LDmGacPz9dvpvIsXOXfz+7COtXhKki2VqEx/XwWHz2opw
11+
82uMj59bSBrCzf+Y417G60Me/mPuYdxiqRoFKsszrsH7HiQgQroBM/X8Trq6OmXc
12+
CGDsYO0tUT0xYVFoW1j3rMGh4wV9z5G3LSKFtO54uHdGUmJUSFATcwOnME9acUUj
13+
jG9qCn/dIkXjKIZ/jwaaA65GG/P60VGOJG+AjHbiBbEPXD/IA++Y4X2M2H4jvQrr
14+
oG7bLD4Zaa/B88Jv7ymZh88SCZpYqd0I96G5DSzlzoNpqLwhNmcdy+ViSIqlFfD9
15+
HpbQwT0mQJeUPj8KmXtOl2GVunwNkdBEaRURXiD4l9CPCmFXGb1RKt02RY6Nvf6X
16+
w9/SvipGsCaGbALoQb1UvKiL7JqU9eYoslYb84A+abbPQtiy7MBZqbyhNQ2PI2ct
17+
FV1z+h5GV/wzI1y+CWeCJWhjysShMBNv/eOfp8iStkIqI7M+2qKHyzMusqZxov3Y
18+
8QgcQqbDSR/mWZ4Kl1/h/RC+qPy20bgeYAT5VvXhBasu7Mzq+5qiZ+T9FK/nTkq6
19+
xLMYGLbFe2tRWJMBxeHVu/YuG8gwjWVrhalfFmWeh2skqPIeymGpTxU42XUaI4zr
20+
7CVoyWalnMYZWbGculaVFutSyIlqshY0w56PXVpt5usow968rTw+Nf8YeQ/pLFi4
21+
r0fteQSOEXdwGgy8/fcvhzaPbgJfTcIbaRgP89q/HORYDjm/P03jHXmiT11ZeF84
22+
pqtGRTJqCbL7n/vc/5gXdvYt88alxEn9sIyhNugpXWp9EJefnyUscxI036wbBK4O
23+
sNSewqIpp+kGn/Xf/PqfkKQVZkA9YacMcPiKoGVYExoujukfeHwZ/jq7geOqYa+H
24+
+NPUd5VS8lxX/lhAt3Nit97UnJ2oQvbHsV/+eJ65/1e41hS0h1xpzd4HLhDoQEfV
25+
Q0L+1h9cbwU/IyUXK+4fr4nUNolSYNzXfurGKDLVtjFpR+naupr2CwQU7gKHKikF
26+
7GuogsTbtK9L3jkIla/lYTqKiJlz/vA6erTmI06aENt0DnnVKPaQZhJ8571lKmRV
27+
xe+e56R4s0AZBOpZjykkr7hDWQ2QGwbgKOYHF9KRl/yQZwD1ezRu3feSUdPkRrLY
28+
efPH24L0jEampqIhx4XGFbhYX/WnuvneA2oiswmB4zR4YT2F8PeMw4gd3t0nGljz
29+
U/NbbQ7P5ZP8JjQbHecSIZf262mHCGuWtnul9T4DjTubyD3LO6AXxw==
30+
-----END RSA PRIVATE KEY-----
Binary file not shown.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDszCCApugAwIBAgIVAImurbHhcSbc4LTPdTawV03y+KXtMA0GCSqGSIb3DQEB
3+
CwUAMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlmaWNhdGUgVG9vbCBBdXRvZ2Vu
4+
ZXJhdGVkIENBMB4XDTE4MTIxNDA1MDcwNloXDTI4MDcxNDA1MDcwNlowDzENMAsG
5+
A1UEAxMEaHR0cDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAI5zBwHm
6+
5kwiV3tYlOl0AEruYNUjRfYwQ2OtBIILCgnu0USMx4r1I6IoHDuLl9Z197I1UfSF
7+
c49hG5U82gAFtWblYoITPkzW50sSB7un/rehXkwTIMbl0i024rWQfGGj6uGHmlU4
8+
T+2YWZNksdGEWx7pcG9WZ4r7rjCy7A0SbewhHmD9SxxZgfsW2UI1bu/iXKC8cb7L
9+
DYBnYCDiYheAA3zOPm1zIB12BDsMuFBF4vIEHlxwOH9pH8jC6vuSEnMqTct81uN9
10+
6EwhPvEixrklffj3XDDYYQzoyF3yiabBt3PTm5v56IadcxjQZT/S5fGBuApTLfdV
11+
w6aCzxTa0vEx0k0CAwEAAaOB4DCB3TAdBgNVHQ4EFgQUwQ35Nzes5weOuudemw3z
12+
MK9ZlkcwHwYDVR0jBBgwFoAU5Z+KO7SVv1cmEjSV24K2GJyEd3MwgY8GA1UdEQSB
13+
hzCBhIIJbG9jYWxob3N0ghdsb2NhbGhvc3Q2LmxvY2FsZG9tYWluNocEfwAAAYcQ
14+
AAAAAAAAAAAAAAAAAAAAAYIKbG9jYWxob3N0NIIKbG9jYWxob3N0NoIVbG9jYWxo
15+
b3N0LmxvY2FsZG9tYWlughdsb2NhbGhvc3Q0LmxvY2FsZG9tYWluNDAJBgNVHRME
16+
AjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBQ7B6jdsMjT7qHQJV68kVdrJwDLekpWPvQ
17+
f+YgPZaWkQoVI7rpBJGm7ZY49RI61JLA1SDxjHS3wL3EYRo1FuXwQj6K/h9wxrpn
18+
is1Ib9IewxeueGhi0DMr+Wf5Nh6cDC7I0Uftr2NJsmwivZV9ZlECjckpIZjwIHpb
19+
imtb27MBcVzWjVLL+NLDa2upuVVYdeiuIcbpMqjOFW7mn6/FczgbMjg8zOQG7+fF
20+
pUEduOJDkmxLe14aKagqyaZDMpX1g1CiM3V899/kYXMPPP9F5f7WOg0+QGfBSig3
21+
3KNPfiQyaIeIePhtRC4iPgP1WI5QaiOVd0GwNwp1W39GeJv6/Wit
22+
-----END CERTIFICATE-----
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: DES-EDE3-CBC,73350501C44BDD9D
4+
5+
3LAGS/e2rkuTBIyIVhFEFy/uG4gUJlJ+5rBTYkmxIfZWkUin+yEoThvJsYptiXCr
6+
hjDIXhZkob2NVfEae9KRW6rETs/7ZwZfR5XpgeYbre8/JyfEo0I5QvcatZMAJ6Gz
7+
3UEXnjIxrowg3voRW12oa6ppa8K1zwfr5y7GscCuJvL/eBp+/TkFAtCbcLwnvUBI
8+
rZ3VjsUO5VvElRgmttI8L9zyt6KJA2laM6D/DZW25JYa++BNkFMBxP7DiEl+fmGL
9+
x1d+ozHVxcxVANO/UrtkvBqyF5M9S69vbz0XSCZX/oV/a0IuzzHiZy0YnK2TPKZw
10+
V6IgFPACzBoh4NSL/BKFmbw5jefQ11n80bGgQL7ijaKp0+1CdDo+0/My6RnpbbGK
11+
lcKpPLTtkSL7/xD3YMbFZ/XbXBu14j8G5zZ3rD+QMYle+tVOJz5TALSEhqWZraS4
12+
eNnjUaodChAzolZep6fIL3lyy/2rWs0QmWxLR92NjfSp8C2yw2c0X9FrsTXiCiWS
13+
N+1+Pd3j+IRH0r+p9BPvTWRIXHotm6MmhOhyQarj4+6bE6JYcQST7bu4d9c2ng9c
14+
VyWNWh0MgVMeBxIZ5EIbX8oZSOHhAQco0lqazydNc5t2A4KzvSrkog4EH7Bm4Tqc
15+
b0YiqL4A7Ars0qzVRngd+/Xmpzx+zJKTRw/klb3RzsfGmrzgcdMqLJh9vcwV74Et
16+
m7M5+q8wwyQkj+u1c8YS9bqCbo7R3aw8iImg9AGiP0Tx646AspUUm9FO7SnASxb1
17+
e5+Hen0ggrMlX3iopUBHApmhkPYODKTlh0JyyVFidnDAJ5QV4RhAiTGdRE7GQMuv
18+
2E9NnOk6Tkag5QAMiI9i8IhfMF3805OJAmvoindRT2cLYy1EjK42ohhkIOuD1SK/
19+
15NbNFe32f2QuHlkpk8xpj2yzJwk/tBBGAUqmmB1MjP1xnVrLlGPp/Dowq7lU6zk
20+
iH+jzIL2EAIMjfHLarJAhVzzmY+hpotUTku5iBzYDIwjL8k9nB44WnYhkTJhqp6G
21+
IF85G31SXo5qUXguZ31/yZoaepmi26uZH+737V4ni39JuI/5KXqZCrlkfO0IkSZH
22+
X0Lmzgg5m6gVvilCdN67CYz4Px433/tj89FNyKqBodo2v7WekkHCvZEo52skwgCm
23+
t5C/G4HZeGui8DErK3e+ePZd5aQ6KdVMMBZF46MpAgakLRtgHO63AjI9U8SjohwP
24+
7AnVRaK7dTnueMW/00FdtK1QGBdeLcuiWdEKUs4NBrl00SuAXgadaeGkRuOtqOBx
25+
0aKfKtRlFHQ2shUR8eixKwtGx1awQ25xo4HMfI8xk+waN4ieWiMNjNaXGUHLYF7f
26+
qIxURNS/RSzpQevoDHg/lYzgiVtvqgEmH8mjURHq91MU9iM0qn7i05Yn33zFl5y9
27+
AHavhhM8qFDJ14LefTEAx39aJ0ZdeskBVPzYpXv6qlA4uDscJkOUuDG2vJxIlSnb
28+
GeM1yqmbCrtYqJv5ygfNTQ+xycnwZAcRcxkdjenJ1XJscj8T2jUJAfL7qEUp+fMO
29+
AodfQLZL40THoCy6AFZlFSy2mvr1yZ995Z7dyq30HpJE7BqH/z/4HpMn1rjTT/aE
30+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)