gpt4 book ai didi

java - 是否可以在 Apache Kafka Java 客户端中禁用 SSL 证书验证?

转载 作者:行者123 更新时间:2023-12-03 19:20:54 24 4
gpt4 key购买 nike

如果我有自签名证书,作为一个好公民,我会将其导入我的 keystore 并使用“ssl.truststore.location”和“ssl.truststore.type”配置 Kafka 客户端以使用它。

如果期望证书主题中的公用名可能与提供它的主机地址不同,我可以使用“ssl.endpoint.identification.algorithm”关闭端点验证。

如果我想完全跳过 SSL 验证,而不仅仅是主机名,那么我不再需要复制证书怎么办?类似于 curl 中的“-k”或“--insecure”设置。我可以使用 Kafka 的默认 Java 客户端来执行此操作吗?

最佳答案

有一种方法可以完成它,但它并不那么简单。
这个想法是实现将忽略证书验证的接口(interface) org.apache.kafka.common.security.auth.SslEngineFactory。当您将它用作客户端时,只需以类似于以下方式实现 createClientSslEngine 方法就足够了:

import org.apache.kafka.common.security.auth.SslEngineFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.Set;

public static class MySslEngineFactory implements SslEngineFactory {
@Override
public SSLEngine createClientSslEngine(String peerHost, int peerPort, String endpointIdentification) {
try {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
public void checkServerTrusted(X509Certificate[] certs, String authType) { }
}};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLEngine sslEngine = sc.createSSLEngine(peerHost, peerPort);
sslEngine.setUseClientMode(true);
return sslEngine;
} catch (NoSuchAlgorithmException | KeyManagementException e) {
throw new RuntimeException(e);
}
}

@Override
public SSLEngine createServerSslEngine(String peerHost, int peerPort) {
return null;
}

@Override
public boolean shouldBeRebuilt(Map<String, Object> nextConfigs) {
return false;
}

@Override
public Set<String> reconfigurableConfigs() {
return null;
}

@Override
public KeyStore keystore() {
return null;
}

@Override
public KeyStore truststore() {
return null;
}

@Override
public void close() throws IOException {

}

@Override
public void configure(Map<String, ?> configs) {

}
}
完成此类后,您只需在 kafka(生产者或消费者)属性中将其配置为 SSL_ENGINE_FACTORY_CLASS:
props.put(SslConfigs.SSL_ENGINE_FACTORY_CLASS, MySslEngineFactory.class);
或者如果您不想使用常量:
props.put("ssl.engine.factory.class", MySslEngineFactory.class);
确保不要在生产中使用此设置!

关于java - 是否可以在 Apache Kafka Java 客户端中禁用 SSL 证书验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59318588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com