Skip to content

Commit d85489b

Browse files
author
amijkum
committed
BAEL-8591 updated code for mTLS calls with Java Client, added tests
1 parent 68a1a0a commit d85489b

File tree

7 files changed

+116
-17
lines changed

7 files changed

+116
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.baeldung.mtls.calls;
2+
3+
import javax.net.ssl.HostnameVerifier;
4+
5+
public class HostNameVerifierBuilder {
6+
7+
static HostnameVerifier allHostsValid = (hostname, session) -> true;
8+
9+
public static HostnameVerifier getAllHostsValid() {
10+
return allHostsValid;
11+
}
12+
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.baeldung.mtls.httpclient;
1+
package com.baeldung.mtls.calls;
22

33
import java.io.ByteArrayInputStream;
44
import java.io.IOException;
@@ -35,8 +35,8 @@ public static SSLContext buildSslContext()
3535
final Properties props = System.getProperties();
3636
props.setProperty("jdk.internal.httpclient.disableHostnameVerification", Boolean.TRUE.toString());
3737

38-
String privateKeyPath = "/etc/certs/client.key.pkcs8";
39-
String publicKeyPath = "/etc/certs/client.crt";
38+
String privateKeyPath = "src/main/resources/keys/client.key.pkcs8";
39+
String publicKeyPath = "src/main/resources/keys/client.crt";
4040

4141
final byte[] publicData = Files.readAllBytes(Path.of(publicKeyPath));
4242
final byte[] privateData = Files.readAllBytes(Path.of(privateKeyPath));
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIID8zCCAdugAwIBAgIBATANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLnlv
3+
dXIuaG9zdG5hbWUwHhcNMjUwNzA3MTY0NTMzWhcNMjYwNzA3MTY0NTMzWjAcMRow
4+
GAYDVQQDDBEqLmNsaWVudC5ob3N0bmFtZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
5+
ADCCAQoCggEBAKavVV7T7MEWY2pVUSWzIGfaVqSEBgKmdUJWnNGHwZrBX/XjJ9LN
6+
srBAOjT/mJ4ccoMTKY8agDmF7z0nz8fQSr5D4JQ6C1yBbjKL04BwLSrNIRPIzWrb
7+
F4ztADOrrh1l3YaRYbwMWkFZjcoRX9zXYooMbZPrgBSskQ8hdnrIMtc04+FvFhyP
8+
5hEtqvR9I8qGjxGx/wXAYA539Owh9T3Xl0vVroxtv2eFNYIIg7BV1yHrX1RalEbx
9+
5mzfeM7o/IJRvj/73jVhdvu2csUM4J20NxSx1B9XoFZI8Y0JPOR4bo3j7zZXE0iH
10+
ib6/pWYxdZknWDsm7qHTLZJNEFPNk/W2/0UCAwEAAaNCMEAwHQYDVR0OBBYEFOkk
11+
ZcxKbJpkiG0Mr5ce/6ykH9rGMB8GA1UdIwQYMBaAFARhDN6rdEw0ylzmwgVRXUbO
12+
BNmJMA0GCSqGSIb3DQEBCwUAA4ICAQAGPhAPinkHWHfSiQRChtxEAnTPVavsuC6X
13+
UyGGpWHz7OD475SbzYnuaTN+O/2HUoP3qyVWH8igSOLBY1vpUXthkSHBltH21Gog
14+
NFW4Z4/8NBlvM25BiBA/hGANFu5MvWuB9gNfHryWSZHFf0fyOd7ITIY2pDUHkqlc
15+
e5pAkjGAlvATGeF8PcMzYDAF6DamtJVZtqha/ssAGPlDggbr55LqtKos9TphYGsN
16+
LOnWv+f81TB8euLUTJpFg4i+t5QGmQ1UWv2N1U4TEo5fpRb+y6E/vorUH4qpDKOn
17+
31mvjxkgW05Jf21GKQU5LtYIfR3ZVa7UlWkdr9x763pzNUB0q8ioPQ2jQ3bzrJEO
18+
El3dhiWCUAXGxljKWeuUwkdws3D4mOru6hVwE7vE31ZD3mnO52uOtwd6sKeGg7zj
19+
OgTu06/KSbYEVsZ1yic8CWVSR2Sn+4HtXo7cEuBCnWJIkqRNGoFTbKULaSWLN+Lh
20+
wzTIcBA6E5SoHXY0T80EsVQAq2LV7bymDklHeBWUMr47guUUyBsoZg36njA7geT5
21+
T8dIeyClWHZNwqa8kxbQt6WAY21qqUyovsn0js26Ni8sr3iv+akXZkeJGopgYV4g
22+
BNMow0BNLsKLRhDM0gkIqlOwHMRIYwsdNkrSk4mnZoxlGIotVb4JCAazxss5rJR2
23+
IVboXKO91g==
24+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCmr1Ve0+zBFmNq
3+
VVElsyBn2lakhAYCpnVCVpzRh8GawV/14yfSzbKwQDo0/5ieHHKDEymPGoA5he89
4+
J8/H0Eq+Q+CUOgtcgW4yi9OAcC0qzSETyM1q2xeM7QAzq64dZd2GkWG8DFpBWY3K
5+
EV/c12KKDG2T64AUrJEPIXZ6yDLXNOPhbxYcj+YRLar0fSPKho8Rsf8FwGAOd/Ts
6+
IfU915dL1a6Mbb9nhTWCCIOwVdch619UWpRG8eZs33jO6PyCUb4/+941YXb7tnLF
7+
DOCdtDcUsdQfV6BWSPGNCTzkeG6N4+82VxNIh4m+v6VmMXWZJ1g7Ju6h0y2STRBT
8+
zZP1tv9FAgMBAAECggEAC5oBjaeff3MA+Wo1yzN0CnZyeGHuDyop2DOyF41k5tIV
9+
zUYBxBToHodh5cVyiHK/b6saRekYyqgtViratfQj96k+zOJbXxVtJ5x+3J4yLpv3
10+
dOqRjaHxOjBWxsHozQgFirO8wzty3sCOc2WRMAxXwfcKe3S1Rfsa35w7JGGh1EOv
11+
ygOACa+9iLsT8iAVGtmaFybp3wNFS+MYibe/v7qhM1MLktGJH8tZIzYr87iLP7uF
12+
6WZve1/QCvNwyvKsdSYIvNzaVYJTuWacTVKaANmEci5TYtQzFVQScX9PdrdNtQdu
13+
2pxtbI0Y8oT04KXQ0Bsnejc5ckE/pzgIzB17lF+O0QKBgQDhIZ48YxaRWN1JEsii
14+
zvzcEz3hMKBzZ//oFB0/tb4AFuIrMaeoVZf0jH571KWO9BV+ExxCBIROr7twdIxk
15+
OfwCGN4034+hJlBxrBSf8lN3jYHV6t1xBniz1PkoUjUI+RzjoPY9T0hsYUv76vcZ
16+
2uqgCCXlu2Ssj+MPRkeH2laXyQKBgQC9iizU1NiHgwxL7TVf9Wiz7wxC/UWe9/32
17+
EZyFS83GIJffLXowQA997qWa/NtbcP+Dpdm6vbYbW6FBRE7EH6zQgLWZtollmuaR
18+
cmCXzSmB84P5wz8fF0o8HZnjzMiM4Dm8pUXlNj/05QUGBT+4YG5pKKqR5RLj3rXE
19+
i4eUaDMhnQKBgQClZ2OwjkSIaTe7dld+doEE2AZAqs9XuvMjeZO7uTVtL2LfxU2e
20+
ubQ48fgD1soEa4RW6od6YYMrpKUcDCURhiCHEepAAniuN04nFfzZPtrgHVFk73fe
21+
kJih1zlvzGY2v3/gJeSESvm01w9SeOEvV83F4famALYIqnZyRHpNb7brMQKBgQCp
22+
bBp4wC0wrEZQlB9SwBWwSOyH8MbLu1bKHqHvUHwGLtoyRv9io9B1O93R9VXKne33
23+
6kb+MlfWiohQw9M4YiviUDqDxPN53AVfW4LWDjCdFWQR3KHOk83qgHcvdbyKmF9j
24+
rcQVh/GRYSmlYQm9MI1g+FXHhaDmCQwnPKWbVazmzQKBgHV3r3ahlszePYHQmQLr
25+
4eJM7Kj3Y0SydM3402TLH8DG4CeuOkO+/ZhHAE3AgAzQptOqbZ25/RS+7O6N+Wa1
26+
Lo6kbrSgoqQgqzyHrp3PcWeJ1n/mef0QxbV/fKWWfdzFRtA2oTwXteW3Dzmu7A84
27+
65QBcsuKKf34GJfvwl8eQT/O
28+
-----END PRIVATE KEY-----

core-java-modules/core-java-httpclient/src/main/java/com/baeldung/mtls/httpclient/HttpClientExample.java renamed to core-java-modules/core-java-httpclient/src/test/java/com/baeldung/mtls/calls/MutualTLSCallWithHttpClientLiveTest.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.baeldung.mtls.httpclient;
1+
package com.baeldung.mtls.calls;
22

33
import java.io.IOException;
44
import java.net.URI;
@@ -14,10 +14,14 @@
1414

1515
import javax.net.ssl.SSLContext;
1616

17-
public class HttpClientExample {
17+
import org.assertj.core.api.Assertions;
18+
import org.junit.Test;
1819

19-
public static void main(String[] args)
20-
throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException, InvalidKeySpecException,
20+
public class MutualTLSCallWithHttpClientLiveTest {
21+
22+
@Test
23+
public void whenWeExecuteMutualTLSCallToNginxServerWithHttpClient_thenItShouldReturnStatusOK()
24+
throws UnrecoverableKeyException, CertificateException, IOException, InvalidKeySpecException, NoSuchAlgorithmException, KeyStoreException,
2125
KeyManagementException {
2226
SSLContext sslContext = SslContextBuilder.buildSslContext();
2327
HttpClient client = HttpClient.newBuilder()
@@ -31,7 +35,10 @@ public static void main(String[] args)
3135

3236
HttpResponse<String> response = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
3337
.join();
34-
38+
Assertions.assertThat(response)
39+
.isNotNull();
40+
Assertions.assertThat(response.statusCode())
41+
.isEqualTo(200);
3542
}
3643

3744
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.baeldung.mtls.httpclient;
1+
package com.baeldung.mtls.calls;
22

33
import java.io.IOException;
44
import java.io.InputStream;
@@ -11,24 +11,26 @@
1111
import java.security.cert.CertificateException;
1212
import java.security.spec.InvalidKeySpecException;
1313

14-
import javax.net.ssl.HostnameVerifier;
1514
import javax.net.ssl.HttpsURLConnection;
1615
import javax.net.ssl.SSLContext;
1716

18-
public class HttpURLConnectionExample {
17+
import org.assertj.core.api.Assertions;
18+
import org.junit.Test;
1919

20-
public static void main(String[] args)
21-
throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException, InvalidKeySpecException,
20+
public class MutualTLSCallWithHttpURLConnectionLiveTest {
21+
22+
@Test
23+
public void whenWeExecuteMutualTLSCallToNginxServerWithHttpURLConnection_thenItShouldReturnNonNullResponse()
24+
throws UnrecoverableKeyException, CertificateException, IOException, InvalidKeySpecException, NoSuchAlgorithmException, KeyStoreException,
2225
KeyManagementException {
2326
SSLContext sslContext = SslContextBuilder.buildSslContext();
24-
25-
HostnameVerifier allHostsValid = (hostname, session) -> true;
2627
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) new URL("https://127.0.0.1/ping").openConnection();
2728
httpsURLConnection.setSSLSocketFactory(sslContext.getSocketFactory());
28-
httpsURLConnection.setHostnameVerifier(allHostsValid);
29-
29+
httpsURLConnection.setHostnameVerifier(HostNameVerifierBuilder.getAllHostsValid());
3030
InputStream inputStream = httpsURLConnection.getInputStream();
3131
String response = new String(inputStream.readAllBytes(), Charset.defaultCharset());
32+
Assertions.assertThat(response)
33+
.isNotNull();
3234
}
3335

3436
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.mtls.calls;
2+
3+
import java.io.IOException;
4+
import java.security.KeyManagementException;
5+
import java.security.KeyStoreException;
6+
import java.security.NoSuchAlgorithmException;
7+
import java.security.UnrecoverableKeyException;
8+
import java.security.cert.CertificateException;
9+
import java.security.spec.InvalidKeySpecException;
10+
11+
import javax.net.ssl.SSLContext;
12+
13+
import org.assertj.core.api.Assertions;
14+
import org.junit.Test;
15+
16+
public class SslContextBuilderUnitTest {
17+
18+
@Test
19+
public void whenPrivateAndPublicKeysAreGiven_thenAnSSLContextShouldBeCreated()
20+
throws UnrecoverableKeyException, CertificateException, IOException, InvalidKeySpecException, NoSuchAlgorithmException, KeyStoreException,
21+
KeyManagementException {
22+
SSLContext sslContext = SslContextBuilder.buildSslContext();
23+
Assertions.assertThat(sslContext)
24+
.isNotNull();
25+
}
26+
}

0 commit comments

Comments
 (0)