Add smoke test to verify MongoDB SSL connections

See gh-35042
pull/35256/head
Scott Frederick 2 years ago
parent 3bb271e320
commit 5ac6a3d90b

@ -37,7 +37,7 @@ public final class DockerImageNames {
private static final String KAFKA_VERSION = "5.4.3";
private static final String MONGO_VERSION = "4.0.23";
private static final String MONGO_VERSION = "5.0.17";
private static final String NEO4J_VERSION = "4.4.11";

@ -0,0 +1,24 @@
plugins {
id "java"
id "org.springframework.boot.conventions"
}
description = "Spring Boot Data MongoDB smoke test"
dependencies {
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-data-mongodb"))
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-data-mongodb-reactive"))
implementation("io.projectreactor:reactor-core")
testImplementation(project(":spring-boot-project:spring-boot-test"))
testImplementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-test"))
testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
testImplementation(project(":spring-boot-project:spring-boot-testcontainers"))
testImplementation("io.projectreactor:reactor-test")
testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation("org.junit.platform:junit-platform-engine")
testImplementation("org.junit.platform:junit-platform-launcher")
testImplementation("org.testcontainers:junit-jupiter")
testImplementation("org.testcontainers:testcontainers")
testImplementation("org.testcontainers:mongodb")
}

@ -0,0 +1,44 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "exampleDocuments")
public class ExampleDocument {
private String id;
private String text;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getText() {
return this.text;
}
public void setText(String text) {
this.text = text;
}
}

@ -0,0 +1,24 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ExampleMongoApplication {
}

@ -0,0 +1,23 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
interface ExampleReactiveRepository extends ReactiveMongoRepository<ExampleDocument, String> {
}

@ -0,0 +1,23 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import org.springframework.data.mongodb.repository.MongoRepository;
interface ExampleRepository extends MongoRepository<ExampleDocument, String> {
}

@ -0,0 +1,35 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
private final MongoTemplate mongoTemplate;
public ExampleService(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
public boolean hasCollection(String collectionName) {
return this.mongoTemplate.collectionExists(collectionName);
}
}

@ -0,0 +1,64 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Smoke tests for MongoDB using reactive repositories with SSL.
*
* @author Scott Frederick
*/
@Testcontainers(disabledWithoutDocker = true)
@SpringBootTest(properties = { "spring.data.mongodb.ssl.bundle=client",
"spring.ssl.bundle.pem.client.keystore.certificate=classpath:ssl/test-client.crt",
"spring.ssl.bundle.pem.client.keystore.private-key=classpath:ssl/test-client.key",
"spring.ssl.bundle.pem.client.truststore.certificate=classpath:ssl/test-ca.crt" })
class DataMongoTestReactiveSslIntegrationTests {
@Container
@ServiceConnection
static final MongoDBContainer mongoDB = new SecureMongoContainer();
@Autowired
private ReactiveMongoTemplate mongoTemplate;
@Autowired
private ExampleReactiveRepository exampleRepository;
@Test
void testRepository() {
ExampleDocument exampleDocument = new ExampleDocument();
exampleDocument.setText("Look, new @DataMongoTest!");
exampleDocument = this.exampleRepository.save(exampleDocument).block(Duration.ofSeconds(30));
assertThat(exampleDocument.getId()).isNotNull();
assertThat(this.mongoTemplate.collectionExists("exampleDocuments").block(Duration.ofSeconds(30))).isTrue();
}
}

@ -0,0 +1,65 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.data.mongodb.core.MongoTemplate;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Smoke tests for MongoDB with SSL.
*
* @author Scott Frederick
*/
@Testcontainers(disabledWithoutDocker = true)
@SpringBootTest(properties = { "spring.data.mongodb.ssl.bundle=client",
"spring.ssl.bundle.pem.client.keystore.certificate=classpath:ssl/test-client.crt",
"spring.ssl.bundle.pem.client.keystore.private-key=classpath:ssl/test-client.key",
"spring.ssl.bundle.pem.client.truststore.certificate=classpath:ssl/test-ca.crt" })
@ImportAutoConfiguration(SslAutoConfiguration.class)
class DataMongoTestSslIntegrationTests {
@Container
@ServiceConnection
static final MongoDBContainer mongoDB = new SecureMongoContainer();
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private ExampleRepository exampleRepository;
@Test
void testRepository() {
ExampleDocument exampleDocument = new ExampleDocument();
exampleDocument.setText("Look, new @DataMongoTest!");
exampleDocument = this.exampleRepository.save(exampleDocument);
assertThat(exampleDocument.getId()).isNotNull();
assertThat(this.mongoTemplate.collectionExists("exampleDocuments")).isTrue();
}
}

@ -0,0 +1,51 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package smoketest.data.mongo;
import java.time.Duration;
import com.github.dockerjava.api.command.InspectContainerResponse;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.utility.MountableFile;
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
/**
* A {@link MongoDBContainer} for MongoDB with SSL configuration.
*
* @author Scott Frederick
*/
class SecureMongoContainer extends MongoDBContainer {
SecureMongoContainer() {
super(DockerImageNames.mongo());
withStartupAttempts(5);
withStartupTimeout(Duration.ofMinutes(5));
}
@Override
public void configure() {
withCopyFileToContainer(MountableFile.forClasspathResource("/ssl/test-server.pem"), "/ssl/server.pem");
withCopyFileToContainer(MountableFile.forClasspathResource("/ssl/test-ca.crt"), "/ssl/ca.crt");
withCommand("mongod --tlsMode requireTLS --tlsCertificateKeyFile /ssl/server.pem --tlsCAFile /ssl/ca.crt");
}
@Override
protected void containerIsStarted(InspectContainerResponse containerInfo, boolean reused) {
}
}

@ -0,0 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFhjCCA26gAwIBAgIUDZ27G/Rq0YhtKcRQD0emU7stb10wDQYJKoZIhvcNAQEL
BQAwOzEZMBcGA1UECgwQU3ByaW5nIEJvb3QgVGVzdDEeMBwGA1UEAwwVQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MB4XDTIzMDUwMjE5MTY0M1oXDTMzMDQyOTE5MTY0M1ow
OzEZMBcGA1UECgwQU3ByaW5nIEJvb3QgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNh
dGUgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsbUG
UlbE13ZviqIwbwa5K7LDrwKfnolV3nPCPDo4vKFzLbBtgTN6AIzN978Rv6vVzUWL
LO3JlJ98iGLcQxmQFNW8YG4rPO5HFFm6nrnkvTX1X0e2wM5tnjpqxqbONTkm2fN/
mf3IR6L95O/D0cIDvvqxAVfEdhIrDFWnOEHt0wWUpFh1/f01prEDO2WADZNwn7l4
nkxW3hMldGyjE8wpT+osRMTYWRlqS4ZBeY9gneXycMP8x2+uP1BlJi1eSkSWjJcr
CdxJQZpy1ShiOHgrH92naf1FXYo7ZN/P0FfjZm26UhRYcibDyxS8B93OXHhaohlo
anBrYB1XrYs8hpJQX2tREUVLB6BdeK2QtOad+ejHNhBgNF8yH0yqNxBQznNe+oSY
Vh6o03r3s8WsdEWWZJUS3h2YXe8RTBRm5Bppp+reQHkfhd/7ser2oRaOdBtcDy/P
deYFK6VYJSFNNcQh8HICuMUEJ62LO9w2caOSPsb5vfdL4kFthVcXeAhZEwT0wNkT
RDBGJgjEPZ5TAXPyqrl9wizXikp+3i+2o7BiZNI20a6ISX1BBSQtBfMO1Axn7pPB
2jJI+HLSdAC4yZiCWc8YEUovboXswFfZF8OsQYflcEdegRLx6fHjRrgsLOGf9FZK
sJ2dHpjLRSe9nPKUkHfB9+dkUJjNsi4fMWaYOzUCAwEAAaOBgTB/MB0GA1UdDgQW
BBSHD3XlcpjpyBY7ZJYTQcgDBALrizAfBgNVHSMEGDAWgBSHD3XlcpjpyBY7ZJYT
QcgDBALrizAPBgNVHRMBAf8EBTADAQH/MCwGA1UdEQQlMCOCC2V4YW1wbGUuY29t
gglsb2NhbGhvc3SCCTEyNy4wLjAuMTANBgkqhkiG9w0BAQsFAAOCAgEAlH2MoUaJ
rBoIa5r+hSVzAF9NrbYLbCckwMz/nFjJGOhIHr9A4v7/wqWIqj8IkZXA7C+CGxGo
CroLI1TnFuNQ/dvjvMp8LLeZpXjrCsK1M2oZT9mZKq27CFGZ/MgUcxj5yvis+Jqx
FgKSQIKbSL+VazjeWMlKQ6E8OFG7wWTtVXf+EXpJ09vv9rjVFnH7conRXY3Ehk6g
5v3hNyLExGpF+ZiCdph8bzl6OpCDnZsSThgg9n7nQJFMNNLJeSqdsubxsMasESjd
svLStlHKgpn5RYxGt32TY+SNQqZjx1JGmGfJ3ZgkqrMGt2Sn6fap+5l//k6jQS2n
amt7fJQUsb0esHJnx2/De5gTpGe3GC0oV4pYdVTa7Q6p/v39QC2xodORv0CAMYZ+
gZIFyiJyEnntguWyGwPix1duqWZ77oXP3vIeuDSHHFO0MDYokFbQJnRfqq3Yweof
WNwfSl1oz2N0SkM0ReAL2ILzHqzveHLHlF9+z9AlFkosBjMlado9IYUqcH3Fz6dF
mVr1aR4Pzx9mPLngxjHN0IrCbmurxO9UCQdKVjlip+io0XsXEIfcVpAatyCKMoCQ
asinymcbBUmIdgRE40b/C95ZufXDwzIVlOspy1kBW7MHygK/Z8Dar4sd6IxIIfun
/Ytm09/9WUCrCX0dvH08KiRgamTaDEVUgQk=
-----END CERTIFICATE-----

@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIIEGjCCAgKgAwIBAgIUfNbd10WD9F5RGiWEGJ4MMEgYtWQwDQYJKoZIhvcNAQEL
BQAwOzEZMBcGA1UECgwQU3ByaW5nIEJvb3QgVGVzdDEeMBwGA1UEAwwVQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MB4XDTIzMDUwMjE5MTY0M1oXDTI0MDUwMTE5MTY0M1ow
LzEZMBcGA1UECgwQU3ByaW5nIEJvb3QgVGVzdDESMBAGA1UEAwwJbG9jYWxob3N0
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwKlofgVj8ayX20VxeXwv
u0Ac41e6HzfPy8XzBjo67uMFCpXZNhnDIt5VZGilsqAiHfN/VzuQfDkGkwdw28RT
wmcfJflgaNNjGIHvOBcVpsRMmMrqnYWIqJ4yTdaKdWeGEH8imotTarrXJufliAyN
PyZQpOSv0i0huAXl41qN9196o7MqbhQlBLAzf8Jhc9JCbplyVAfxCjIb2zyjr7h5
SbppJitbJTK8T5kD98ZHop6AJWNd6ow4iBULH0ByMEWVa6/nYlxmxNjPwAXf55lu
z+DFFsAOz0eMR7xxF7U5ueWrfsvHvAA0BMrixQqiOZq1Z1CYVlc4LwQJDtFdhy1G
UwIDAQABoyIwIDALBgNVHQ8EBAMCBaAwEQYJYIZIAYb4QgEBBAQDAgeAMA0GCSqG
SIb3DQEBCwUAA4ICAQCU5rbionr7KK7wqzBoaZFwkBoNucQCrLX2V+BwU1sYrQFG
uwqgl6pX3dZ95wOJ93Pz8hMXl7cUMVzu92al91gR6RJeEEAfzE1nvv+3u8I/iT2w
jcmS5j/pZEYJsfcwhtwVQN72g4QYrNCfq2heGY4ovdaMwtlUQiSEgvYxF/cchrDx
ylWOENfUtRFEQ00r13mvVbyTi+JOqEv80kqxBfZGlRflkrB7moyBruyz5Skr8TTx
MIcxnpC7fwLxNwfk8iJiW9v5Aj/bd0ulmzwrPEn+ONo9mdKNRqi15wwqky8vpLNT
I+P5t4cpZUCDCJFPPXhQKMNdSwZQpv4hMJqp5/qORfA5A3Wl9EzTtmwmra43pZ39
4PMl0AHt5sq0pFfVPZ0eaySBFZfgxEuvzw6tSsadisHfCkToNVFVV08hKtqtezXE
C3152LiHlnUl/1VkZlWqRx6zyY1myshWy/OU9LeNAB6Hw7QTPGFPNKQ3NpxKvprx
D/lD/kvZe8UJHcV50Q6pu4/KF4tLhP+poCBDGNlj078vwZa3IEXJpn2yYkpxmJGj
WspnXbGSxIiS4ioVFh+BvHjDW0S/Ci8wMiVoid7sbR9J79JnNnujzLzjpW1wkTx/
XBUukd8Ncc7FTfXIpf2l+XJiRU/1+zRkfU8gT/T5h7kDVU5YqanbluJgEokQ4g==
-----END CERTIFICATE-----

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAwKlofgVj8ayX20VxeXwvu0Ac41e6HzfPy8XzBjo67uMFCpXZ
NhnDIt5VZGilsqAiHfN/VzuQfDkGkwdw28RTwmcfJflgaNNjGIHvOBcVpsRMmMrq
nYWIqJ4yTdaKdWeGEH8imotTarrXJufliAyNPyZQpOSv0i0huAXl41qN9196o7Mq
bhQlBLAzf8Jhc9JCbplyVAfxCjIb2zyjr7h5SbppJitbJTK8T5kD98ZHop6AJWNd
6ow4iBULH0ByMEWVa6/nYlxmxNjPwAXf55luz+DFFsAOz0eMR7xxF7U5ueWrfsvH
vAA0BMrixQqiOZq1Z1CYVlc4LwQJDtFdhy1GUwIDAQABAoIBAQC4O8euat0t58u3
ZOqkL3s9Zou5YtSasbZFuF8zH0/nzLOvcagqsewGVfH2eJOrArJdTdIByvXZtHZy
9vSXU2B9UDtbBuOImkvyzZ3CV2De/mv42GIOi/kotU6JXJU+u+ZZtBmVC5KTR2Qi
0jKOLOKM9si7RexT4dCStyEkjh2f5MTQh79xOncmxG9YPWR3RzXfMNzfkYaMtdxZ
Bsf2iKnO6zJmsPlqlyZi1/9csNI1XLNhcWyVpR67i3WTfH3Q7kNQ0a15OfB15Lox
jmayuEW+AqHjbMYJR7d5ExdxMFWquXwYm5kZl4H13ws4hBGaCpQ5xRLhTHiK98SV
7/GJ/y9hAoGBAPZB3X8b4maYqK6Cfuvr+IkYIzBZEODPfhpleeeKt5XoitGkcbKS
Xx8og2h3fwcs7OO/VOowffH1SVoTFJhdFRGBa9y0kBXTuPQ59knQMmT3EeI2L5lx
AtJHZ5LHUtfYXM0gFLZOWhkxFZyoNu4IDtbIuDop0/xDlAPMBUd8Yiz7AoGBAMhI
t+xVCatl0Fk4luToETmJSHtx3c1NMI7NPPFO3vtzEthb4JACQH0P0s97igL095DS
TX+FArbCEsnhOwytD5LgseZHYljmYm7ENLmeAPi2ttGIU/alhrolJoC4SdhSdfXd
qqKG4f/P44KnB6OAkmeCycJ7G8n6YxLCM+bQG1yJAoGBAIwCZLmZE/66+uTFIv5l
mlfv1kntya/XqN2/JjEj6D8eCJcrBM2/dL+VXCkwD5P30fOm29OOoHzJtdu1j3cV
LR5X1AiWzHjseHK65bGP4qcO5icUIbn+y9jcaiHEm/BGfnTNsZj5MTazdpMr/JcX
E8DAPCYtk+4QSf5ip/m92V+zAoGBAKEe7ucumfLKm0vLXIiVsJWqvSahuZ9ZQ4D9
1tMBchyyvCxV7VesmBiDzEGhzqsGSsq0hCfb5w0DH35MtOZDqs2r+TGZp6KA5Brb
uNbCJ2HuCzCRDYrUKohBLrJKjw15eO/r/UN2YwUaRppqqJh97EldS9Yql3Zq+Zyz
onFCZWCRAoGAYP3BaT2pgtEIHsRCzv7XKpC37aIw/Wqc/XKkw50OT3+Atgbryp5s
JgIaD6mop/BZG5PPvRJeH75X2BOOhWENeR3q+I8dW9sCq68sy8gDVHlmCCUctsz0
7FNihJKloin0e11hzYVZYbOjD+96lyF03y2t3kzf6oOnSMmOXhXKWxI=
-----END RSA PRIVATE KEY-----

@ -0,0 +1,51 @@
-----BEGIN CERTIFICATE-----
MIIEGjCCAgKgAwIBAgIUfNbd10WD9F5RGiWEGJ4MMEgYtWMwDQYJKoZIhvcNAQEL
BQAwOzEZMBcGA1UECgwQU3ByaW5nIEJvb3QgVGVzdDEeMBwGA1UEAwwVQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MB4XDTIzMDUwMjE5MTY0M1oXDTI0MDUwMTE5MTY0M1ow
LzEZMBcGA1UECgwQU3ByaW5nIEJvb3QgVGVzdDESMBAGA1UEAwwJbG9jYWxob3N0
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Tc0YVQluRdSzPDnfkcF
IZ/Gl58wFJz//4S0hPsQ/yGmV2DxDGR6nMEPOvPSRAxufnejossQxHT/td48A9rq
WT7ijTOWdzjAHDe9UKMWlsdBeOQgHfr6X+gINxiPDKGgA+Ih94ku0pxluO8vyIy8
vhDchIAveQNa/U7olja9IGp2Lmy+Kk566pAguT/V5I6V1/jX4VBhi+YFUKLs3fAh
0d0QNiVdypLe+s1cXBocanBg6iMQWQN9vL8ZM5dDP/w2Fl2FYCOwjicLUb+Dxeoc
h8SYn/BBrQRePn5A483w49B5pgRUyOFwgr0bchw1B6P2bGdPzwYfpUw1sJGVocSB
cwIDAQABoyIwIDALBgNVHQ8EBAMCBaAwEQYJYIZIAYb4QgEBBAQDAgZAMA0GCSqG
SIb3DQEBCwUAA4ICAQCHWmclf0/GHHNdhb9cw2CaeXWxy7u8U5MYdTq7MdRIK+Nn
xO9I9TWVIt+un3C0Bs2IKkg1l72wnoLL1Gy5EsK0hO3p+UD2/FRgVI2HBlda/TKW
7ZlFd1i7u67Cf++7mHnaSQYokkTrEMZacj6PSoNv2pmkSzb5VYT9q3hVtVhtliOq
U30hkUy9FU3VJNpGAOUkasIRB/KAG6TTJ+/L3N0jcTfAlXPwuJcj2XsMoAibAfEE
HXTHmW+6cK358Mb8HDx9wdT5yPfly5KTVbqYhwX6XeL2an/BVdwoUY0dqyWgaoDr
dxBaYew0O2rDy748OWnYR4ARTO+I8XfT+aEjMqQownpG6WDaubmN2o9MVweYx7CT
qWkxmx8Nb+w1i9PIY73uJTjx6CBDHMgbPovMttvxsVg+VDaTNGFGDey0q5R6U6rA
VwxEkeZwwV1ZZGlw9cGhxYxKQnrC/BGcV/w/4+g9fYFW5+M2hyy7YpHAuiw9kwmV
uYp/Njd8AtXRw3LLPpxsdJkyOJrnczF+MAaaswYQFFHhbi3n7tlchCq1T1Tj+Xae
WdyHAkQSy/smlezB2I6gFVU6pFQNmasO4ZhAItbSzvjxk5GlfzdBbhgXsxSA52oa
xpLEY1NPLSbHun50WSOzhJ+rpbgRKoPGixMzVteDoZHGVQyM/an8pgW4opLWhA==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA+Tc0YVQluRdSzPDnfkcFIZ/Gl58wFJz//4S0hPsQ/yGmV2Dx
DGR6nMEPOvPSRAxufnejossQxHT/td48A9rqWT7ijTOWdzjAHDe9UKMWlsdBeOQg
Hfr6X+gINxiPDKGgA+Ih94ku0pxluO8vyIy8vhDchIAveQNa/U7olja9IGp2Lmy+
Kk566pAguT/V5I6V1/jX4VBhi+YFUKLs3fAh0d0QNiVdypLe+s1cXBocanBg6iMQ
WQN9vL8ZM5dDP/w2Fl2FYCOwjicLUb+Dxeoch8SYn/BBrQRePn5A483w49B5pgRU
yOFwgr0bchw1B6P2bGdPzwYfpUw1sJGVocSBcwIDAQABAoIBAQCkUi4Lbrxgymwi
DUXWEWXkwcDkAGZncQ2qoQmWFSUj1EAlpRnLHgVqjjFIobOmgrvoT2Jp2JL5tltU
w2+26wVSSxB+IeG4QocJFAeTv7UJPeCBoYk7u1yTGB8ylNLddURYyyWyXZWt8Mlx
ouRSy9k3SU7dXtfuZrP8Cad6RCV31O102IgT53kSaCVdIcJ9Owos8Vvk3iu+bedL
EmW3Z6V7qg5ASDVLHaaMFjpiQsLvV7ljg+HP7y4sKxEovKqc6G7lF4CnMMlN0zwm
4QRE6tHzNV93QoUAgPBxel7GaAVZTO9AJ2zZxkKzqr5InqTL/IDCAvru08jIuuTW
DyhyHCrBAoGBAP717gmCSEbvrnRlQi71AAZHx6FkNXmxbL8yfLyX5vwDwuHleo5i
JCxWKW+kcP1WcU997wpV5jGUUjjNeyoUA7HVBHgU9fumAyaMyb5LJmM+6nVdTlWI
1UvGHTQHsAJ/XC0KxQjYJfA+uLmSHkJzEAUm8zptkgTQ9N325/7qyyjpAoGBAPo7
R4iHm/aLwi5YvEYjljHdbIWTlNjxwhvQCI//0CadaEyJ7bi1yTwTfamy9jmJC1zO
xpUSoVNLaymZthYIz1UKpATvsvnx2lN4ROzCBvWO238PJo284GpxfYJMVHWx9Dya
u9e/C3nbJhd+VKWeyJ3j0qczucbR8x5HHFC6yR37AoGBAMD72a9s49R9u2jy9EOi
wt/+GQb6WNfCCnQ2fOArgnUjS7G9ByUa+BJvLXIJ4FSBx8bJpdQG7PR+NjY0opNZ
DureOEHEa+SM5jmZu2LEc0wP5VvswkxQBFMUpCor33gketrFGhr1sNHGSAB+r1TQ
z0F3GAgTw8DNgWs5ZqU3h4txAoGBAKHPcXtlDcKJL4Ee2miUnIwUPhfGjksXUkj/
5nmPl39Q7GAKFRILY1yY0frJghVEfHeAMsO1L2MYcuyMvEVVXxUD83pJsjeUYHT3
YcKj2TIzNdbc6jZfe9L5HosCZt9Qurnx6SQjIv2ia+hnRb9vhRUsfEyo0yoxG4Bp
xXKixmi/AoGAJ+fLUO/ThUGPAkx7N6wTvlV44gu+UN4V1/b4NTVez3G6l4xLnbBC
tiSHWpSY2FJaCEBQNCjw7xoVG/XI1AZiQOhb/RC/MFGaB1+Gl4gH/kzAwxKILyLT
qCrP9vW4wwPulRgLkJUDH4xtzuu2C9/1JWe5h+Bk5YgCwIjz5qVwPC0=
-----END RSA PRIVATE KEY-----
Loading…
Cancel
Save