Skip to content

Commit 315bdf4

Browse files
committed
Add tests for mTLS
Add mTLS integration tests and resources Co-authored-by: Oleg Kuznetsov <[email protected]> Closes #328
1 parent 079b10f commit 315bdf4

File tree

9 files changed

+316
-5
lines changed

9 files changed

+316
-5
lines changed

.github/workflows/tests-ee.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,6 @@ jobs:
4040
TARANTOOL_VERSION: ${{ matrix.tarantool-version }}
4141
TARANTOOL_SERVER_USER: root
4242
TARANTOOL_SERVER_GROUP: root
43-
DOWNLOAD_SDK_URI: ${{ secrets.DOWNLOAD_SDK_URI }}
43+
DOWNLOAD_SDK_URI: https://tarantool:${{ secrets.DOWNLOAD_SDK_TOKEN }}@download.tarantool.io/enterprise/release/linux/x86_64/2.10
44+
SDK_VERSION: tarantool-enterprise-sdk-nogc64-2.10.4-0-r523.linux.x86_64
4445
run: mvn -B test -P enterprise --file pom.xml

src/test/java/io/tarantool/driver/integration/SslClientITEnterprise.java renamed to src/test/java/io/tarantool/driver/integration/ssl/SslClientITEnterprise.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.tarantool.driver.integration;
1+
package io.tarantool.driver.integration.ssl;
22

33
import io.netty.handler.ssl.SslContext;
44
import io.netty.handler.ssl.SslContextBuilder;
@@ -48,7 +48,7 @@ public static void setUp() throws URISyntaxException, SSLException {
4848
);
4949
final Map<String, String> buildArgs = new HashMap<>();
5050
buildArgs.put("DOWNLOAD_SDK_URI", System.getenv("DOWNLOAD_SDK_URI"));
51-
buildArgs.put("SDK_VERSION", "tarantool-enterprise-bundle-2.10.0-beta2-91-g08c9b4963-r474");
51+
buildArgs.put("SDK_VERSION", System.getenv("SDK_VERSION"));
5252

5353
final TarantoolClientBuilder tarantoolClientBuilder = TarantoolClientFactory.createClient()
5454
.withSslContext(getSslContext());
@@ -81,7 +81,7 @@ public static void setUp() throws URISyntaxException, SSLException {
8181
}
8282

8383
@Test
84-
public void test_should_throwException_ifClientWithSslButServerNot() throws SSLException {
84+
public void test_clientConnectWithSsl_should_connects_ifServerIsNonSSL() throws SSLException {
8585
//when
8686
final TarantoolClientBuilder tarantoolClientBuilder = TarantoolClientFactory.createClient()
8787
.withAddress(containerWithoutSsl.getHost(), containerWithoutSsl.getMappedPort(3301))
@@ -99,7 +99,7 @@ public void test_should_throwException_ifClientWithSslButServerNot() throws SSLE
9999
}
100100

101101
@Test
102-
public void test_should_clientConnectWithSsl() throws SSLException {
102+
public void test_clientConnectWithSsl_should_connects() throws SSLException {
103103
//when
104104
final TarantoolClientBuilder tarantoolClientBuilder = TarantoolClientFactory.createClient()
105105
.withAddress(containerWithSsl.getHost(), containerWithSsl.getMappedPort(3301))
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package io.tarantool.driver.integration.ssl;
2+
3+
import io.netty.handler.ssl.SslContext;
4+
import io.netty.handler.ssl.SslContextBuilder;
5+
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
6+
import io.tarantool.driver.api.TarantoolClient;
7+
import io.tarantool.driver.api.TarantoolClientBuilder;
8+
import io.tarantool.driver.api.TarantoolClientFactory;
9+
import io.tarantool.driver.api.TarantoolResult;
10+
import io.tarantool.driver.api.tuple.TarantoolTuple;
11+
import io.tarantool.driver.exceptions.TarantoolClientException;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.junit.jupiter.api.BeforeAll;
14+
import org.junit.jupiter.api.Test;
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
17+
import org.testcontainers.containers.TarantoolContainer;
18+
import org.testcontainers.containers.TarantoolImageParams;
19+
import org.testcontainers.containers.output.Slf4jLogConsumer;
20+
21+
import javax.net.ssl.TrustManagerFactory;
22+
import java.io.File;
23+
import java.io.InputStream;
24+
import java.security.KeyStore;
25+
import java.util.HashMap;
26+
import java.util.List;
27+
import java.util.Map;
28+
import java.util.concurrent.CompletionException;
29+
30+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
31+
import static org.junit.jupiter.api.Assertions.assertEquals;
32+
import static org.junit.jupiter.api.Assertions.assertThrows;
33+
34+
/**
35+
* @author Oleg Kuznetsov
36+
* @author Ivan Dneprov
37+
*/
38+
public class SslClientMTlsITEnterprise {
39+
40+
private static final Logger log = LoggerFactory.getLogger(SslClientMTlsITEnterprise.class);
41+
42+
private static TarantoolContainer containerWithSsl;
43+
44+
@BeforeAll
45+
public static void setUp() throws Exception {
46+
final File dockerfile = new File(
47+
SslClientITEnterprise.class.getClassLoader()
48+
.getResource("org/testcontainers/containers/enterprise/Dockerfile").toURI()
49+
);
50+
final Map<String, String> buildArgs = new HashMap<>();
51+
buildArgs.put("DOWNLOAD_SDK_URI", System.getenv("DOWNLOAD_SDK_URI"));
52+
buildArgs.put("SDK_VERSION", System.getenv("SDK_VERSION"));
53+
54+
final TarantoolClientBuilder tarantoolClientBuilder = TarantoolClientFactory.createClient()
55+
.withSslContext(getSslContextWithCA())
56+
.withConnectTimeout(5000);
57+
58+
containerWithSsl = new TarantoolContainer(
59+
new TarantoolImageParams("tarantool-enterprise", dockerfile, buildArgs), tarantoolClientBuilder)
60+
.withScriptFileName("mtls_server.lua")
61+
.withUsername("test_user")
62+
.withPassword("test_password")
63+
.withMemtxMemory(256 * 1024 * 1024)
64+
.withDirectoryBinding("org/testcontainers/containers/enterprise/ssl/mtls")
65+
.withLogConsumer(new Slf4jLogConsumer(log));
66+
67+
if (!containerWithSsl.isRunning()) {
68+
containerWithSsl.start();
69+
}
70+
}
71+
72+
@Test
73+
public void test_clientConnectWithMtls_should_connects() throws Exception {
74+
//when
75+
final TarantoolClient<TarantoolTuple, TarantoolResult<TarantoolTuple>> clientWithSsl =
76+
TarantoolClientFactory.createClient()
77+
.withAddress(containerWithSsl.getHost(), containerWithSsl.getMappedPort(3301))
78+
.withCredentials("test_user", "test_password")
79+
.withSslContext(getSslContextWithCA())
80+
.build();
81+
82+
//then
83+
assertDoesNotThrow(clientWithSsl::getVersion);
84+
final List<?> result = assertDoesNotThrow(() -> clientWithSsl.eval("return 'test'").join());
85+
assertEquals("test", result.get(0));
86+
}
87+
88+
@Test
89+
public void test_clientConnectToMTLSServerWithoutCA_should_throwException() throws Exception {
90+
//given
91+
final SslContext sslContext = SslContextBuilder.forClient()
92+
.trustManager(InsecureTrustManagerFactory.INSTANCE)
93+
.build();
94+
//when
95+
final TarantoolClient<TarantoolTuple, TarantoolResult<TarantoolTuple>> clientWithSsl =
96+
TarantoolClientFactory.createClient()
97+
.withAddress(containerWithSsl.getHost(), containerWithSsl.getMappedPort(3301))
98+
.withCredentials("test_user", "test_password")
99+
.withSslContext(sslContext)
100+
.build();
101+
102+
//then
103+
assertThrows(TarantoolClientException.class, clientWithSsl::getVersion);
104+
assertThrows(CompletionException.class, () -> clientWithSsl.eval("return 'test'").join());
105+
}
106+
107+
@NotNull
108+
private static SslContext getSslContextWithCA() throws Exception {
109+
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
110+
final File keyCertChainFile = new File(classloader
111+
.getResource("org/testcontainers/containers/enterprise/ssl/mtls/ca.crt").toURI());
112+
final File keyFile = new File(classloader
113+
.getResource("org/testcontainers/containers/enterprise/ssl/mtls/ca.key").toURI());
114+
115+
String keyStoreFilePassword = "12345678";
116+
KeyStore keyStore = KeyStore.getInstance("PKCS12");
117+
118+
InputStream trustStore = classloader
119+
.getResourceAsStream("org/testcontainers/containers/enterprise/ssl/mtls/trustStoreFile");
120+
keyStore.load(trustStore, keyStoreFilePassword.toCharArray());
121+
122+
TrustManagerFactory trustManagerFactory = TrustManagerFactory
123+
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
124+
trustManagerFactory.init(keyStore);
125+
126+
return SslContextBuilder.forClient()
127+
.trustManager(trustManagerFactory)
128+
.keyManager(keyCertChainFile, keyFile)
129+
.build();
130+
}
131+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-----BEGIN CERTIFICATE-----
2+
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
32+
-----END CERTIFICATE-----
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
YfB9GdaUnR0F648bsknruMJrFjfZFbo=
52+
-----END PRIVATE KEY-----
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
box.cfg { listen = {
2+
uri = 3301,
3+
params = {
4+
transport = 'ssl',
5+
ssl_key_file = 'server.key',
6+
ssl_cert_file = 'server.crt',
7+
ssl_ca_file = 'ca.crt'
8+
}
9+
} }
10+
11+
box.schema.user.create('test_user', { password = 'test_password', if_not_exists = true })
12+
box.schema.user.grant('test_user', 'read, write, execute', 'universe', nil, { if_not_exists = true })
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFSjCCAzICFAGDWf+4nbv3f7+QrRbP8Q3YhzOaMA0GCSqGSIb3DQEBCwUAMFUx
3+
EDAOBgNVBAsMB1Vua25vd24xEDAOBgNVBAoMB1Vua25vd24xEDAOBgNVBAcMB1Vu
4+
a25vd24xEDAOBgNVBAgMB3Vua25vd24xCzAJBgNVBAYTAkFVMCAXDTIyMDUzMTIx
5+
MDUwOVoYDzIxMjIwNTA3MjEwNTA5WjBsMRUwEwYDVQQDDAx0YXJhbnRvb2wuaW8x
6+
EDAOBgNVBAsMB1Vua25vd24xEDAOBgNVBAoMB1Vua25vd24xEDAOBgNVBAcMB1Vu
7+
a25vd24xEDAOBgNVBAgMB3Vua25vd24xCzAJBgNVBAYTAkFVMIICIjANBgkqhkiG
8+
9w0BAQEFAAOCAg8AMIICCgKCAgEAy8ClyS3WZlJwycdRM1Nteke6adcgScUz0hVn
9+
yhZJpZo4crReCTtCzOWNstlA5nnzlDT56YbnmzAwDNG6pPP00t2jVUU5wxMJSDGy
10+
SkDk0nxq4Rd20EDV3+GIxJ+aEEPYwMcY4RcGErG+5yrSVbWniDLcvKeMjLjODzUr
11+
vzSuBsRgtMt8Z6vQUaBxIdT3XupLFSZb4k883TkQE8wXjqbLmmOPoQAu1WZVAKEV
12+
uvxXKonYlgC00Rl7HsaEMw8zUL7P1e+qtn6GaXkdI55Lk2y/yk0UKhBWR43mDoTx
13+
VWyWrVnL7rFLt7Doz6F8Q5tiekjz3WpVhm2z7aGMZ/n3FE3etNVbnZg1/wqXjini
14+
VXCgaUKryEYKR1kgPxUJB7EHjSLIGIn1Ix6toMK6ntr+WySMUfSt0A5jsQ3WM1TY
15+
8YOdFuFbeiPpTD9Qq7hDPW1AyGOkh31eecqVwBJQlajRrkZBBZ8EacbR6aDgBfm4
16+
n3gtoUuZZYf1aW1HzlWjaVp6M5gJCbbvuGjcfpVAbq71PTM6PYHvfe2wlbfJR02V
17+
H7kGUUbE3A1JIGSys44FLaitY3Gy+X/Tj+bEH1uid/Q6ykcCcU/ICDoaXBQ9jbSv
18+
56CfIjoSUY2JXpDG/Ahli/b6pwvP9CkLGTDc0VWpuG4sB3sbzjhYyijDac48/JuJ
19+
HVk1mMcCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEARGdetChBKbDNaxGA+NHAtDGe
20+
2lVISV21j5L1EkWQhrp39bx1YsFmvV+wibYuTDTlk/XSh+MpuRvTmc8xWXIIe30Y
21+
PQXQPCrRd8vNjHt6i0MpW4kCe0QU/PTGOOBpD1VnJuAuebqmLuvdwCHb5uCacbVJ
22+
Gt9voyM3yQQNZ0A3jYcm7Y6PAEL/gxq0+F30+LwvZqaAGO6hqC7WJuiyoE9No9ri
23+
+0vZG0F0l1ZiVWaIi5m38KfYGuhd8tAEKkTUZ2cL0Td/KOavCgJ1D8s4co3wyDZG
24+
qrIVKHYvl8G2YivQdXpMuh32QAog/34zI909pM0E2IzxRl6YBjP9UaAUW6LWWuWZ
25+
1pso3pL/+WynAUC9gsWFcnsv3Ji4ZH24nA7BemBwo5JT/5WTtMTAA4phQDH340x4
26+
VnHPigcvyu3eh/PDS7ZdiUSGuNcibSTrhn4bluCv5vzzmw+Atp9eccF81LxfERJY
27+
4H94Kw70/8LBLR/7McL/aobJ5mSpAK1nnsRdr1xE46uGpkmK4pgHfD5xkcn9AFxE
28+
vsCnwynYp4RNPfiLUHNzez0T4JWnJqPtSNtR2jTO3iVz04SUbUj/cltXOLzyPfyM
29+
VouEL2VnAmC1WCN5KC6NnzyKVLbQ7EAi4x+61lJWWkRugxrXeaVdNbgQlA1yvAlF
30+
cA8F69eVyPJnFsdWSq0=
31+
-----END CERTIFICATE-----
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
jE5s8iIxjb4IkPziVOzgev4epyIs
52+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)