Skip to content

Commit 4ac5e7d

Browse files
Merge pull request #217 from okta/ak_add_support_for_ssl_factory_and_trust_store_httpclient
OKTA-741803: Add support for SSL Factory and Truststore to HttpClient
2 parents cb6922a + 9da15df commit 4ac5e7d

7 files changed

Lines changed: 58 additions & 4 deletions

File tree

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,18 @@ The Okta JWT Verifier can created via the fluent `JwtVerifiers` class:
4747

4848
[//]: # (method: basicUsage)
4949
```java
50+
// see https://sslcontext-kickstart.com/usage.html for detailed usage options
51+
SSLFactory sslFactory = SSLFactory.builder()
52+
.withIdentityMaterial("identity.jks", "password".toCharArray())
53+
.withTrustMaterial("truststore.jks", "password".toCharArray())
54+
.build();
5055
AccessTokenVerifier jwtVerifier = JwtVerifiers.accessTokenVerifierBuilder()
5156
.setIssuer("https://{yourOktaDomain}/oauth2/default")
5257
.setAudience("api://default") // defaults to 'api://default'
5358
.setConnectionTimeout(Duration.ofSeconds(1)) // defaults to 1s
5459
.setRetryMaxAttempts(2) // defaults to 2
5560
.setRetryMaxElapsed(Duration.ofSeconds(10)) // defaults to 10s
56-
.setPreloadSigningKeys(true) // defaults to false
61+
.setSslFactory(sslFactory)
5762
.build();
5863
```
5964
[//]: # (end: basicUsage)

api/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@
2929

3030
<dependencies>
3131

32+
<dependency>
33+
<groupId>io.github.hakky54</groupId>
34+
<artifactId>sslcontext-kickstart</artifactId>
35+
</dependency>
36+
<dependency>
37+
<groupId>io.github.hakky54</groupId>
38+
<artifactId>sslcontext-kickstart-for-pem</artifactId>
39+
</dependency>
40+
3241
<!-- test deps -->
3342
<dependency>
3443
<groupId>org.hamcrest</groupId>

api/src/main/java/com/okta/jwt/VerifierBuilderSupport.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package com.okta.jwt;
1717

18+
import nl.altindag.ssl.SSLFactory;
19+
1820
import java.time.Clock;
1921
import java.time.Duration;
2022

@@ -107,6 +109,14 @@ public interface VerifierBuilderSupport<B extends VerifierBuilderSupport, R> {
107109
*/
108110
B setClock(Clock clock);
109111

112+
/**
113+
* Sets the {@code sslFactory} the verifier will use for http client.
114+
*
115+
* @param sslFactory the ssl factory instance to be used by the underlying HTTP client.
116+
* @return a reference to the current builder for use in method chaining
117+
*/
118+
B setSslFactory(SSLFactory sslFactory);
119+
110120
/**
111121
* Sets the {@code preloadSigningKeys} the verifier will use to determine if it needs to prefetch Signing keys into cache at boot time.
112122
*

examples/quickstart/src/main/java/com/okta/jwt/example/QuickStartExample.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public static void main(String[] args) throws Exception {
3434
String audience = args[1];
3535
String jwtString = args[2];
3636

37-
3837
// 1. build the parser
3938
AccessTokenVerifier jwtVerifier = JwtVerifiers.accessTokenVerifierBuilder()
4039
.setIssuer(issuerUrl)

examples/quickstart/src/main/java/com/okta/jwt/example/ReadmeSnippets.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.okta.jwt.AccessTokenVerifier;
1919
import com.okta.jwt.JwtVerifiers;
20+
import nl.altindag.ssl.SSLFactory;
2021

2122
import java.time.Duration;
2223

@@ -29,12 +30,20 @@
2930
public class ReadmeSnippets {
3031

3132
private void basicUsage() {
33+
34+
// See https://sslcontext-kickstart.com/usage.html for detailed usage options
35+
SSLFactory sslFactory = SSLFactory.builder()
36+
.withIdentityMaterial("identity.jks", "password".toCharArray())
37+
.withTrustMaterial("truststore.jks", "password".toCharArray())
38+
.build();
39+
3240
AccessTokenVerifier jwtVerifier = JwtVerifiers.accessTokenVerifierBuilder()
3341
.setIssuer("https://{yourOktaDomain}/oauth2/default")
3442
.setAudience("api://default") // defaults to 'api://default'
3543
.setConnectionTimeout(Duration.ofSeconds(1)) // defaults to 1s
3644
.setRetryMaxAttempts(2) // defaults to 2
3745
.setRetryMaxElapsed(Duration.ofSeconds(10)) // defaults to 10s
46+
.setSslFactory(sslFactory) // set SSL factory
3847
.build();
3948
}
4049
}

impl/src/main/java/com/okta/jwt/impl/jjwt/BaseVerifierBuilderSupport.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.okta.jwt.impl.http.HttpClient;
2323
import com.okta.jwt.impl.http.OktaCommonsHttpClient;
2424
import io.jsonwebtoken.SigningKeyResolver;
25+
import nl.altindag.ssl.SSLFactory;
2526

2627
import java.net.MalformedURLException;
2728
import java.net.URL;
@@ -40,6 +41,7 @@ abstract class BaseVerifierBuilderSupport<B extends VerifierBuilderSupport, R> i
4041
private String proxyPassword = null;
4142
private int retryMaxAttempts = 2; /* based on SDK spec */
4243
private Duration retryMaxElapsed = Duration.ofSeconds(10);
44+
private SSLFactory sslFactory;
4345
private Clock clock = Clock.systemDefaultZone();
4446
private boolean preloadSigningKeys = false;
4547

@@ -145,7 +147,16 @@ public B setClock(Clock clock) {
145147
return self();
146148
}
147149

148-
public boolean getPreloadSigningKeys() {
150+
public SSLFactory getSslFactory() {
151+
return sslFactory;
152+
}
153+
154+
public B setSslFactory(SSLFactory sslFactory) {
155+
this.sslFactory = sslFactory;
156+
return self();
157+
}
158+
159+
public boolean getPreloadSigningKeys() {
149160
return preloadSigningKeys;
150161
}
151162

@@ -196,6 +207,7 @@ protected HttpClient httpClient() {
196207
httpClientConfiguration.setProxyPort(getProxyPort());
197208
httpClientConfiguration.setProxyUsername(getProxyUsername());
198209
httpClientConfiguration.setProxyPassword(getProxyPassword());
210+
httpClientConfiguration.setSslFactory(getSslFactory());
199211
return new OktaCommonsHttpClient(httpClientConfiguration);
200212
}
201213

pom.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<properties>
3333
<github.slug>okta/okta-jwt-verifier-java</github.slug>
3434
<okhttp.version>4.12.0</okhttp.version>
35-
<okta.commons.version>2.0.0</okta.commons.version>
35+
<okta.commons.version>2.0.1</okta.commons.version>
3636
<jjwt.version>0.12.6</jjwt.version>
3737
</properties>
3838

@@ -106,6 +106,16 @@
106106
<artifactId>kotlin-stdlib</artifactId>
107107
<version>2.0.20</version>
108108
</dependency>
109+
<dependency>
110+
<groupId>io.github.hakky54</groupId>
111+
<artifactId>sslcontext-kickstart</artifactId>
112+
<version>8.3.7</version>
113+
</dependency>
114+
<dependency>
115+
<groupId>io.github.hakky54</groupId>
116+
<artifactId>sslcontext-kickstart-for-pem</artifactId>
117+
<version>8.3.7</version>
118+
</dependency>
109119
</dependencies>
110120
</dependencyManagement>
111121
<build>

0 commit comments

Comments
 (0)