Skip to content

Commit 72e5719

Browse files
authored
Merge pull request #49624 from jmartisk/main-issue-49623
Fix TLS config resolution for GraphQL clients
2 parents 51fe493 + 98026e3 commit 72e5719

File tree

3 files changed

+51
-22
lines changed

3 files changed

+51
-22
lines changed

extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/ssl/TypesafeGraphQLClientClientAuthenticationBadKeystoreTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public class TypesafeGraphQLClientClientAuthenticationBadKeystoreTest {
3434
quarkus.tls.my-tls-client.key-store.p12.password=wrong-password
3535
quarkus.smallrye-graphql-client.my-client.url=https://127.0.0.1:%d/
3636
quarkus.tls.my-tls-client.trust-all=true
37+
quarkus.tls.key-store.p12.path=target/certs/graphql-client-keystore.p12
38+
quarkus.tls.key-store.p12.password=password
3739
""".formatted(PORT);
3840

3941
@RegisterExtension

extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/ssl/TypesafeGraphQLClientServerAuthenticationBadKeystoreOnServerTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
@Certificates(baseDir = "target/certs", certificates = {
2222
@Certificate(name = "graphql", password = "password", formats = { Format.PKCS12 }, client = true),
23-
@Certificate(name = "wrong-graphql", password = "wrong-password", formats = { Format.PKCS12 })
23+
@Certificate(name = "wrong-graphql", password = "wrong-password", formats = { Format.PKCS12 }, client = true)
2424
})
2525
public class TypesafeGraphQLClientServerAuthenticationBadKeystoreOnServerTest {
2626

@@ -32,6 +32,8 @@ public class TypesafeGraphQLClientServerAuthenticationBadKeystoreOnServerTest {
3232
quarkus.smallrye-graphql-client.my-client.tls-configuration-name=my-tls-client
3333
quarkus.tls.my-tls-client.trust-store.p12.path=target/certs/graphql-client-truststore.p12
3434
quarkus.tls.my-tls-client.trust-store.p12.password=password
35+
quarkus.tls.trust-store.p12.path=target/certs/wrong-graphql-client-truststore.p12
36+
quarkus.tls.trust-store.p12.password=wrong-password
3537
quarkus.smallrye-graphql-client.my-client.url=https://127.0.0.1:%d/
3638
""".formatted(PORT);
3739

extensions/smallrye-graphql-client/runtime/src/main/java/io/quarkus/smallrye/graphql/client/runtime/SmallRyeGraphQLClientRecorder.java

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.quarkus.runtime.LaunchMode;
1919
import io.quarkus.runtime.RuntimeValue;
2020
import io.quarkus.runtime.annotations.Recorder;
21+
import io.quarkus.runtime.configuration.ConfigurationException;
2122
import io.quarkus.tls.TlsConfiguration;
2223
import io.quarkus.tls.TlsConfigurationRegistry;
2324
import io.smallrye.graphql.client.impl.GraphQLClientConfiguration;
@@ -127,23 +128,35 @@ private GraphQLClientConfiguration toSmallRyeNativeConfiguration(GraphQLClientCo
127128
.map(m -> new HashMap<String, Object>(m)).orElse(null));
128129
quarkusConfig.url().ifPresent(transformed::setUrl);
129130
transformed.setWebsocketSubprotocols(quarkusConfig.subprotocols().orElse(new ArrayList<>()));
130-
resolveTlsConfigurationForRegistry(quarkusConfig)
131-
.ifPresentOrElse(tlsConfiguration -> {
132-
transformed.setTlsKeyStoreOptions(tlsConfiguration.getKeyStoreOptions());
133-
transformed.setTlsTrustStoreOptions(tlsConfiguration.getTrustStoreOptions());
134-
transformed.setSslOptions(tlsConfiguration.getSSLOptions());
135-
tlsConfiguration.getHostnameVerificationAlgorithm()
136-
.ifPresent(transformed::setHostnameVerificationAlgorithm);
137-
transformed.setUsesSni(Boolean.valueOf(tlsConfiguration.usesSni()));
138-
}, () -> {
139-
// DEPRECATED
140-
quarkusConfig.keyStore().ifPresent(transformed::setKeyStore);
141-
quarkusConfig.keyStoreType().ifPresent(transformed::setKeyStoreType);
142-
quarkusConfig.keyStorePassword().ifPresent(transformed::setKeyStorePassword);
143-
quarkusConfig.trustStore().ifPresent(transformed::setTrustStore);
144-
quarkusConfig.trustStoreType().ifPresent(transformed::setTrustStoreType);
145-
quarkusConfig.trustStorePassword().ifPresent(transformed::setTrustStorePassword);
146-
});
131+
132+
// these properties are deprecated, but if they're present, they should override the TLS registry config
133+
// (smallrye-graphql gives them precedence)
134+
quarkusConfig.keyStore().ifPresent(transformed::setKeyStore);
135+
quarkusConfig.keyStoreType().ifPresent(transformed::setKeyStoreType);
136+
quarkusConfig.keyStorePassword().ifPresent(transformed::setKeyStorePassword);
137+
quarkusConfig.trustStore().ifPresent(transformed::setTrustStore);
138+
quarkusConfig.trustStoreType().ifPresent(transformed::setTrustStoreType);
139+
quarkusConfig.trustStorePassword().ifPresent(transformed::setTrustStorePassword);
140+
141+
// only apply TLS registry settings if quarkus.smallrye-graphql-client.CLIENT.key-store|trust-store were not specified
142+
if (quarkusConfig.keyStore().isEmpty() && quarkusConfig.trustStore().isEmpty()) {
143+
resolveTlsConfigurationForRegistry(quarkusConfig)
144+
.ifPresent(tlsConfiguration -> {
145+
transformed.setTlsKeyStoreOptions(tlsConfiguration.getKeyStoreOptions());
146+
transformed.setTlsTrustStoreOptions(tlsConfiguration.getTrustStoreOptions());
147+
transformed.setSslOptions(tlsConfiguration.getSSLOptions());
148+
tlsConfiguration.getHostnameVerificationAlgorithm()
149+
.ifPresent(transformed::setHostnameVerificationAlgorithm);
150+
transformed.setUsesSni(Boolean.valueOf(tlsConfiguration.usesSni()));
151+
});
152+
} else {
153+
quarkusConfig.tlsConfigurationName().ifPresent(name -> {
154+
logger.warn("TLS configuration " + name
155+
+ " was requested but specific keystore/truststore settings were applied too, " +
156+
" ignoring the TLS configuration");
157+
});
158+
}
159+
147160
quarkusConfig.proxyHost().ifPresent(transformed::setProxyHost);
148161
quarkusConfig.proxyPort().ifPresent(transformed::setProxyPort);
149162
quarkusConfig.proxyUsername().ifPresent(transformed::setProxyUsername);
@@ -172,12 +185,24 @@ private Optional<TlsConfiguration> resolveTlsConfigurationForRegistry(GraphQLCli
172185
if (Arc.container() != null) {
173186
TlsConfigurationRegistry tlsConfigurationRegistry = Arc.container().select(TlsConfigurationRegistry.class).orNull();
174187
if (tlsConfigurationRegistry != null) {
175-
if (tlsConfigurationRegistry.getDefault().isPresent()
176-
&& (tlsConfigurationRegistry.getDefault().get().getTrustStoreOptions() != null
177-
|| tlsConfigurationRegistry.getDefault().get().isTrustAll())) {
188+
if (quarkusConfig.tlsConfigurationName().isPresent()) {
189+
// explicit TLS config
190+
Optional<TlsConfiguration> namedConfig = TlsConfiguration.from(tlsConfigurationRegistry,
191+
quarkusConfig.tlsConfigurationName());
192+
if (namedConfig.isEmpty()) {
193+
throw new ConfigurationException("TLS configuration '" + quarkusConfig.tlsConfigurationName().get()
194+
+ "' was specified, but it does not exist.");
195+
}
196+
return namedConfig;
197+
} else {
198+
// no explicit TLS config
178199
return tlsConfigurationRegistry.getDefault();
179200
}
180-
return TlsConfiguration.from(tlsConfigurationRegistry, quarkusConfig.tlsConfigurationName());
201+
} else {
202+
if (quarkusConfig.tlsConfigurationName().isPresent()) {
203+
throw new ConfigurationException("TLS configuration '" + quarkusConfig.tlsConfigurationName().get()
204+
+ "' was specified, but no TLS configuration registry could be found.");
205+
}
181206
}
182207
}
183208
return Optional.empty();

0 commit comments

Comments
 (0)