Skip to content

Commit 5e1cae2

Browse files
committed
Refactor and unify client/server code in SslChannelProvider/SslContextProvider
1 parent f31f080 commit 5e1cae2

File tree

4 files changed

+77
-75
lines changed

4 files changed

+77
-75
lines changed

src/main/java/io/vertx/core/net/impl/SslChannelProvider.java

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727
import java.util.concurrent.Executor;
2828
import java.util.concurrent.TimeUnit;
2929

30-
import static io.vertx.core.net.impl.SslContextProvider.createTrustAllTrustManager;
31-
3230
/**
3331
* Provider for {@link SslHandler} and {@link SniHandler}.
3432
* <br/>
@@ -60,40 +58,34 @@ public SslContextProvider sslContextProvider() {
6058
}
6159

6260
public SslContext sslClientContext(String serverName, boolean useAlpn, boolean trustAll) {
61+
try {
62+
return sslContext(serverName, useAlpn, false, trustAll);
63+
} catch (Exception e) {
64+
throw new VertxException(e);
65+
}
66+
}
67+
68+
public SslContext sslContext(String serverName, boolean useAlpn, boolean server, boolean trustAll) throws Exception {
6369
int idx = idx(useAlpn);
6470
if (serverName == null) {
6571
if (sslContexts[idx] == null) {
66-
SslContext context = sslContextProvider.createClientContext(useAlpn, trustAll);
72+
SslContext context = sslContextProvider.createContext(server, null, null, null, useAlpn, trustAll);
6773
sslContexts[idx] = context;
6874
}
6975
return sslContexts[idx];
7076
} else {
71-
KeyManagerFactory kmf;
72-
try {
73-
kmf = sslContextProvider.resolveKeyManagerFactory(serverName);
74-
} catch (Exception e) {
75-
throw new VertxException(e);
76-
}
77-
TrustManager[] trustManagers;
78-
if (trustAll) {
79-
trustManagers = new TrustManager[] { createTrustAllTrustManager() };
80-
} else {
81-
try {
82-
trustManagers = sslContextProvider.resolveTrustManagers(serverName);
83-
} catch (Exception e) {
84-
throw new VertxException(e);
85-
}
86-
}
87-
return sslContextMaps[idx].computeIfAbsent(serverName, s -> sslContextProvider.createClientContext(kmf, trustManagers, s, useAlpn));
77+
KeyManagerFactory kmf = sslContextProvider.resolveKeyManagerFactory(serverName);
78+
TrustManager[] trustManagers = trustAll ? null : sslContextProvider.resolveTrustManagers(serverName);
79+
return sslContextMaps[idx].computeIfAbsent(serverName, s -> sslContextProvider.createContext(server, kmf, trustManagers, s, useAlpn, trustAll));
8880
}
8981
}
9082

9183
public SslContext sslServerContext(boolean useAlpn) {
92-
int idx = idx(useAlpn);
93-
if (sslContexts[idx] == null) {
94-
sslContexts[idx] = sslContextProvider.createServerContext(useAlpn);
84+
try {
85+
return sslContext(null, useAlpn, true, false);
86+
} catch (Exception e) {
87+
throw new VertxException(e);
9588
}
96-
return sslContexts[idx];
9789
}
9890

9991
/**
@@ -104,27 +96,14 @@ public SslContext sslServerContext(boolean useAlpn) {
10496
public AsyncMapping<? super String, ? extends SslContext> serverNameMapping(boolean useAlpn) {
10597
return (AsyncMapping<String, SslContext>) (serverName, promise) -> {
10698
workerPool.execute(() -> {
107-
if (serverName == null) {
108-
promise.setSuccess(sslServerContext(useAlpn));
109-
} else {
110-
KeyManagerFactory kmf;
111-
try {
112-
kmf = sslContextProvider.resolveKeyManagerFactory(serverName);
113-
} catch (Exception e) {
114-
promise.setFailure(e);
115-
return;
116-
}
117-
TrustManager[] trustManagers;
118-
try {
119-
trustManagers = sslContextProvider.resolveTrustManagers(serverName);
120-
} catch (Exception e) {
121-
promise.setFailure(e);
122-
return;
123-
}
124-
int idx = idx(useAlpn);
125-
SslContext sslContext = sslContextMaps[idx].computeIfAbsent(serverName, s -> sslContextProvider.createServerContext(kmf, trustManagers, s, useAlpn));
126-
promise.setSuccess(sslContext);
99+
SslContext sslContext;
100+
try {
101+
sslContext = sslContext(serverName, useAlpn, true, false);
102+
} catch (Exception e) {
103+
promise.setFailure(e);
104+
return;
127105
}
106+
promise.setSuccess(sslContext);
128107
});
129108
return promise;
130109
};

src/main/java/io/vertx/core/net/impl/SslContextProvider.java

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,29 @@ public SslContextProvider(ClientAuth clientAuth,
6666
this.crls = crls;
6767
}
6868

69-
public VertxSslContext createClientContext(
70-
boolean useAlpn,
71-
boolean trustAll) {
72-
TrustManager[] trustManagers = null;
69+
public VertxSslContext createContext(boolean server,
70+
KeyManagerFactory keyManagerFactory,
71+
TrustManager[] trustManagers,
72+
String serverName,
73+
boolean useAlpn,
74+
boolean trustAll) {
75+
if (keyManagerFactory == null) {
76+
keyManagerFactory = defaultKeyManagerFactory();
77+
}
7378
if (trustAll) {
74-
trustManagers = new TrustManager[] { createTrustAllTrustManager() };
75-
} else if (trustManagerFactory != null) {
76-
trustManagers = trustManagerFactory.getTrustManagers();
79+
trustManagers = SslContextProvider.createTrustAllManager();
80+
} else if (trustManagers == null) {
81+
trustManagers = defaultTrustManagers();
7782
}
78-
return createClientContext(keyManagerFactory, trustManagers, null, useAlpn);
83+
if (server) {
84+
return createServerContext(keyManagerFactory, trustManagers, serverName, useAlpn);
85+
} else {
86+
return createClientContext(keyManagerFactory, trustManagers, serverName, useAlpn);
87+
}
88+
}
89+
90+
public VertxSslContext createContext(boolean server, boolean useAlpn) {
91+
return createContext(server, defaultKeyManagerFactory(), defaultTrustManagers(), null, useAlpn, false);
7992
}
8093

8194
public VertxSslContext createClientContext(
@@ -108,10 +121,6 @@ protected void initEngine(SSLEngine engine) {
108121
}
109122
}
110123

111-
public VertxSslContext createServerContext(boolean useAlpn) {
112-
return createServerContext(keyManagerFactory, trustManagerFactory != null ? trustManagerFactory.getTrustManagers() : null, null, useAlpn);
113-
}
114-
115124
public VertxSslContext createServerContext(KeyManagerFactory keyManagerFactory,
116125
TrustManager[] trustManagers,
117126
String serverName,
@@ -152,6 +161,18 @@ public KeyManagerFactory loadKeyManagerFactory(String serverName) throws Excepti
152161
return null;
153162
}
154163

164+
public TrustManager[] defaultTrustManagers() {
165+
return trustManagerFactory != null ? trustManagerFactory.getTrustManagers() : null;
166+
}
167+
168+
public TrustManagerFactory defaultTrustManagerFactory() {
169+
return trustManagerFactory;
170+
}
171+
172+
public KeyManagerFactory defaultKeyManagerFactory() {
173+
return keyManagerFactory;
174+
}
175+
155176
/**
156177
* Resolve the {@link KeyManagerFactory} for the {@code serverName}, when a factory cannot be resolved, the default
157178
* factory is returned.
@@ -242,22 +263,24 @@ public X509Certificate[] getAcceptedIssuers() {
242263
return trustMgrs;
243264
}
244265

245-
// Create a TrustManager which trusts everything
246-
static TrustManager createTrustAllTrustManager() {
247-
return new X509TrustManager() {
248-
@Override
249-
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
250-
}
266+
private static final TrustManager TRUST_ALL_MANAGER = new X509TrustManager() {
267+
@Override
268+
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
269+
}
251270

252-
@Override
253-
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
254-
}
271+
@Override
272+
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
273+
}
255274

256-
@Override
257-
public X509Certificate[] getAcceptedIssuers() {
258-
return new X509Certificate[0];
259-
}
260-
};
275+
@Override
276+
public X509Certificate[] getAcceptedIssuers() {
277+
return new X509Certificate[0];
278+
}
279+
};
280+
281+
// Create a TrustManager which trusts everything
282+
private static TrustManager[] createTrustAllManager() {
283+
return new TrustManager[] { TRUST_ALL_MANAGER };
261284
}
262285

263286
public void configureEngine(SSLEngine engine, Set<String> enabledProtocols, String serverName, boolean client) {

src/test/java/io/vertx/core/net/impl/SSLHelperTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void testUseJdkCiphersWhenNotSpecified() throws Exception {
4545
helper
4646
.buildContextProvider(new SSLOptions().setKeyCertOptions(Cert.CLIENT_JKS.get()).setTrustOptions(Trust.SERVER_JKS.get()), null, ClientAuth.NONE, null, false, (ContextInternal) vertx.getOrCreateContext())
4747
.onComplete(onSuccess(provider -> {
48-
SslContext ctx = provider.createClientContext(false, false);
48+
SslContext ctx = provider.createContext(false, false);
4949
assertEquals(new HashSet<>(Arrays.asList(expected)), new HashSet<>(ctx.cipherSuites()));
5050
testComplete();
5151
}));
@@ -57,7 +57,7 @@ public void testUseOpenSSLCiphersWhenNotSpecified() throws Exception {
5757
Set<String> expected = OpenSsl.availableOpenSslCipherSuites();
5858
SSLHelper helper = new SSLHelper(new OpenSSLEngineOptions());
5959
helper.buildContextProvider(new SSLOptions().setKeyCertOptions(Cert.CLIENT_PEM.get()).setTrustOptions(Trust.SERVER_PEM.get()), null, ClientAuth.NONE, null, false, (ContextInternal) vertx.getOrCreateContext()).onComplete(onSuccess(provider -> {
60-
SslContext ctx = provider.createClientContext(false, false);
60+
SslContext ctx = provider.createContext(false, false);
6161
assertEquals(expected, new HashSet<>(ctx.cipherSuites()));
6262
testComplete();
6363
}));
@@ -91,7 +91,7 @@ private void testOpenSslServerSessionContext(boolean testDefault){
9191
defaultHelper
9292
.buildContextProvider(sslOptions, null, ClientAuth.NONE, null, false, (ContextInternal) vertx.getOrCreateContext())
9393
.onComplete(onSuccess(provider -> {
94-
SslContext ctx = provider.createServerContext(false);
94+
SslContext ctx = provider.createContext(true, false);
9595

9696
SSLSessionContext sslSessionContext = ctx.sessionContext();
9797
assertTrue(sslSessionContext instanceof OpenSslServerSessionContext);
@@ -201,6 +201,6 @@ private void testTLSVersions(SSLOptions options, Consumer<SSLEngine> check) {
201201
}
202202

203203
public SSLEngine createEngine(SslContextProvider provider) {
204-
return provider.createClientContext(false, false).newEngine(ByteBufAllocator.DEFAULT);
204+
return provider.createContext(false, false).newEngine(ByteBufAllocator.DEFAULT);
205205
}
206206
}

src/test/java/io/vertx/it/SSLEngineTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private void doTest(SSLEngineOptions engine,
9999
}
100100
}
101101
SslContextProvider provider = ((HttpServerImpl)server).sslContextProvider();
102-
SslContext ctx = provider.createClientContext(false, false);
102+
SslContext ctx = provider.createContext(false, false);
103103
switch (expectedSslContext != null ? expectedSslContext : "jdk") {
104104
case "jdk":
105105
assertTrue(ctx.sessionContext().getClass().getName().equals("sun.security.ssl.SSLSessionContextImpl"));

0 commit comments

Comments
 (0)