Skip to content

Commit 3a9d4c0

Browse files
BE: Add skip ssl for SR (#1518)
Co-authored-by: Roman Zabaluev <[email protected]>
1 parent d8c5e44 commit 3a9d4c0

File tree

8 files changed

+67
-17
lines changed

8 files changed

+67
-17
lines changed

api/src/main/java/io/kafbat/ui/KafkaUiApplication.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package io.kafbat.ui;
22

3+
import io.kafbat.ui.service.ssl.SkipSecurityProvider;
34
import io.kafbat.ui.util.DynamicConfigOperations;
5+
import java.security.Security;
46
import org.springframework.boot.autoconfigure.SpringBootApplication;
57
import org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration;
68
import org.springframework.boot.builder.SpringApplicationBuilder;
7-
import org.springframework.context.ConfigurableApplicationContext;
89
import org.springframework.scheduling.annotation.EnableAsync;
910
import org.springframework.scheduling.annotation.EnableScheduling;
1011

@@ -17,8 +18,10 @@ public static void main(String[] args) {
1718
startApplication(args);
1819
}
1920

20-
public static ConfigurableApplicationContext startApplication(String[] args) {
21-
return new SpringApplicationBuilder(KafkaUiApplication.class)
21+
public static void startApplication(String[] args) {
22+
Security.addProvider(new SkipSecurityProvider());
23+
24+
new SpringApplicationBuilder(KafkaUiApplication.class)
2225
.initializers(DynamicConfigOperations.dynamicConfigPropertiesInitializer())
2326
.build()
2427
.run(args);

api/src/main/java/io/kafbat/ui/config/ClustersProperties.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public static class SchemaRegistryAuth {
159159
public static class TruststoreConfig {
160160
String truststoreLocation;
161161
String truststorePassword;
162-
boolean verifySsl = true;
162+
boolean verify = true;
163163
}
164164

165165
@Data
@@ -254,8 +254,8 @@ public boolean use(Boolean request) {
254254
if (enabled) {
255255
if (Boolean.TRUE.equals(request)) {
256256
return true;
257-
} else if (request == null && defaultEnabled) {
258-
return true;
257+
} else {
258+
return request == null && defaultEnabled;
259259
}
260260
}
261261
return false;
@@ -287,7 +287,6 @@ private void flattenClusterProperties() {
287287
}
288288
}
289289

290-
@SuppressWarnings("unchecked")
291290
private Map<String, Object> flattenClusterProperties(@Nullable String prefix,
292291
@Nullable Map<String, Object> propertiesMap) {
293292
Map<String, Object> flattened = new HashMap<>();
@@ -306,8 +305,8 @@ private Map<String, Object> flattenClusterProperties(@Nullable String prefix,
306305

307306
private void validateClusterNames() {
308307
// if only one cluster provided it is ok not to set name
309-
if (clusters.size() == 1 && !StringUtils.hasText(clusters.get(0).getName())) {
310-
clusters.get(0).setName("Default");
308+
if (clusters.size() == 1 && !StringUtils.hasText(clusters.getFirst().getName())) {
309+
clusters.getFirst().setName("Default");
311310
return;
312311
}
313312

api/src/main/java/io/kafbat/ui/serdes/builtin/sr/SchemaRegistrySerde.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.kafbat.ui.serde.api.PropertyResolver;
2525
import io.kafbat.ui.serde.api.SchemaDescription;
2626
import io.kafbat.ui.serdes.BuiltInSerde;
27+
import io.kafbat.ui.service.ssl.SkipSecurityProvider;
2728
import io.kafbat.ui.util.jsonschema.AvroJsonSchemaConverter;
2829
import io.kafbat.ui.util.jsonschema.ProtobufSchemaConverter;
2930
import java.net.URI;
@@ -76,7 +77,8 @@ public void autoConfigure(PropertyResolver kafkaClusterProperties,
7677
kafkaClusterProperties.getProperty("schemaRegistrySsl.keystoreLocation", String.class).orElse(null),
7778
kafkaClusterProperties.getProperty("schemaRegistrySsl.keystorePassword", String.class).orElse(null),
7879
kafkaClusterProperties.getProperty("ssl.truststoreLocation", String.class).orElse(null),
79-
kafkaClusterProperties.getProperty("ssl.truststorePassword", String.class).orElse(null)
80+
kafkaClusterProperties.getProperty("ssl.truststorePassword", String.class).orElse(null),
81+
kafkaClusterProperties.getProperty("ssl.verify", Boolean.class).orElse(true)
8082
),
8183
kafkaClusterProperties.getProperty("schemaRegistryKeySchemaNameTemplate", String.class).orElse("%s-key"),
8284
kafkaClusterProperties.getProperty("schemaRegistrySchemaNameTemplate", String.class).orElse("%s-value"),
@@ -102,7 +104,8 @@ public void configure(PropertyResolver serdeProperties,
102104
serdeProperties.getProperty("keystoreLocation", String.class).orElse(null),
103105
serdeProperties.getProperty("keystorePassword", String.class).orElse(null),
104106
kafkaClusterProperties.getProperty("ssl.truststoreLocation", String.class).orElse(null),
105-
kafkaClusterProperties.getProperty("ssl.truststorePassword", String.class).orElse(null)
107+
kafkaClusterProperties.getProperty("ssl.truststorePassword", String.class).orElse(null),
108+
kafkaClusterProperties.getProperty("ssl.verify", Boolean.class).orElse(true)
106109
),
107110
serdeProperties.getProperty("keySchemaNameTemplate", String.class).orElse("%s-key"),
108111
serdeProperties.getProperty("schemaNameTemplate", String.class).orElse("%s-value"),
@@ -132,7 +135,8 @@ private static SchemaRegistryClient createSchemaRegistryClient(List<String> urls
132135
@Nullable String keyStoreLocation,
133136
@Nullable String keyStorePassword,
134137
@Nullable String trustStoreLocation,
135-
@Nullable String trustStorePassword) {
138+
@Nullable String trustStorePassword,
139+
boolean verifySsl) {
136140
Map<String, String> configs = new HashMap<>();
137141
if (username != null && password != null) {
138142
configs.put(BASIC_AUTH_CREDENTIALS_SOURCE, "USER_INFO");
@@ -145,6 +149,13 @@ private static SchemaRegistryClient createSchemaRegistryClient(List<String> urls
145149
"You specified password but do not specified username");
146150
}
147151

152+
if (!verifySsl) {
153+
configs.put(
154+
SchemaRegistryClientConfig.CLIENT_NAMESPACE + SslConfigs.SSL_TRUSTMANAGER_ALGORITHM_CONFIG,
155+
SkipSecurityProvider.NAME
156+
);
157+
}
158+
148159
// We require at least a truststore. The logic is done similar to SchemaRegistryService.securedWebClientOnTLS
149160
if (trustStoreLocation != null && trustStorePassword != null) {
150161
configs.put(SchemaRegistryClientConfig.CLIENT_NAMESPACE + SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.kafbat.ui.service.ssl;
2+
3+
import java.security.Provider;
4+
5+
public class SkipSecurityProvider extends Provider {
6+
public static final String NAME = "Skip";
7+
8+
public SkipSecurityProvider() {
9+
super(NAME, "1.0", "Skip TrustManagerFactory Provider");
10+
put("TrustManagerFactory." + NAME, "io.kafbat.ui.service.ssl.SkipTrustManagerFactorySpi");
11+
}
12+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.kafbat.ui.service.ssl;
2+
3+
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
4+
import java.security.KeyStore;
5+
import javax.net.ssl.ManagerFactoryParameters;
6+
import javax.net.ssl.TrustManager;
7+
8+
@SuppressWarnings("unused")
9+
public class SkipTrustManagerFactorySpi extends javax.net.ssl.TrustManagerFactorySpi {
10+
11+
public SkipTrustManagerFactorySpi() {
12+
}
13+
14+
@Override
15+
protected void engineInit(KeyStore ks) {
16+
}
17+
18+
@Override
19+
protected void engineInit(ManagerFactoryParameters spec) {
20+
}
21+
22+
@Override
23+
protected TrustManager[] engineGetTrustManagers() {
24+
return InsecureTrustManagerFactory.INSTANCE.getTrustManagers();
25+
}
26+
}

api/src/main/java/io/kafbat/ui/util/KafkaClientSslPropertiesUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static void addKafkaSslProperties(@Nullable ClustersProperties.Truststore
1616
return;
1717
}
1818

19-
if (!truststoreConfig.isVerifySsl()) {
19+
if (!truststoreConfig.isVerify()) {
2020
sink.put(SslConfigs.SSL_ENDPOINT_IDENTIFICATION_ALGORITHM_CONFIG, "");
2121
}
2222

api/src/main/java/io/kafbat/ui/util/WebClientConfigurator.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ private static ObjectMapper defaultOM() {
4747

4848
public WebClientConfigurator configureSsl(@Nullable ClustersProperties.TruststoreConfig truststoreConfig,
4949
@Nullable ClustersProperties.KeystoreConfig keystoreConfig) {
50-
if (truststoreConfig != null && !truststoreConfig.isVerifySsl()) {
50+
if (truststoreConfig != null && !truststoreConfig.isVerify()) {
5151
return configureNoSsl();
5252
}
5353

@@ -130,14 +130,13 @@ public WebClientConfigurator configureBufferSize(DataSize maxBuffSize) {
130130
return this;
131131
}
132132

133-
public WebClientConfigurator configureObjectMapper(ObjectMapper mapper) {
133+
public void configureObjectMapper(ObjectMapper mapper) {
134134
builder.codecs(codecs -> {
135135
codecs.defaultCodecs()
136136
.jackson2JsonEncoder(new Jackson2JsonEncoder(mapper, MediaType.APPLICATION_JSON));
137137
codecs.defaultCodecs()
138138
.jackson2JsonDecoder(new Jackson2JsonDecoder(mapper, MediaType.APPLICATION_JSON));
139139
});
140-
return this;
141140
}
142141

143142
public WebClientConfigurator configureCodecs(Consumer<ClientCodecConfigurer> configurer) {

contract-typespec/api/config.tsp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ model ApplicationConfig {
146146
ssl?: {
147147
truststoreLocation?: string;
148148
truststorePassword?: string;
149-
verifySsl?: boolean = true;
149+
verify?: boolean = true;
150150
};
151151
schemaRegistry?: string;
152152
schemaRegistryAuth?: {

0 commit comments

Comments
 (0)