Spring boot 使用Spring boot和Apache Camel连接Kafka群集时获取SSL异常
我的要求是通过SSL将Kafka主题与Spring Boot和Apache Camel连接起来,我已经编写了以下代码,但我遇到了一个错误,如由sun.security.validator.ValidatorException引起的错误:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求的目标的有效认证路径此 任何人,请帮助我如何解决这个错误Spring boot 使用Spring boot和Apache Camel连接Kafka群集时获取SSL异常,spring-boot,apache-kafka,apache-camel,spring-camel,Spring Boot,Apache Kafka,Apache Camel,Spring Camel,我的要求是通过SSL将Kafka主题与Spring Boot和Apache Camel连接起来,我已经编写了以下代码,但我遇到了一个错误,如由sun.security.validator.ValidatorException引起的错误:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求的目标的有效认证路径此 任何人,请帮助我如何解决这个错误 //in this code i'm configure
//in this code i'm configured the SSL
@Configuration
public class Testing {
@Bean
SSLContextParameters sslContextParameters(){
KeyStoreParameters store = new KeyStoreParameters();
store.setResource("kafka.client.truststore.jks");
store.setPassword("123456");
TrustManagersParameters trust = new TrustManagersParameters();
trust.setKeyStore(store);
SSLContextParameters parameters = new SSLContextParameters();
parameters.setTrustManagers(trust);
return parameters;
}
}
在下面的文件中,我使用sslContextParameters参数调用路由器
@Autowired
SSLContextParameters params;
@Override
public void configure() throws Exception {
from("{{timerOnce}}").process(consumerCreate).to(
"https://xx.xx.xx.xxx/consumers/group-id?sslContextParameters=params");
}
******我使用了另一种方法通过SSL连接Kafka群集,但不幸的是它遇到了这样的异常*********org.apache.camel.spring.boot.CamelSpringBootInitializationException:java.io.IOException:无效的密钥库格式
在下面的代码中,我启用了SSL
下面是我使用的路由器端点中的代码
public void configure() throws Exception {
Endpoint createEndpoint = cdcHelper.setupSSLConext(context);
from("{{timerOnce}}").process(consumerCreate)
.to(createEndpoint); // calling kafka consumer
}
}
您可以按照以下方法使用ApacheCamel和SpringBoot设置Kafka使用者 将以下属性添加到应用程序中。属性
# kafka configuration
kafka.topic=iot1
kafka.camelKafkaOptions.groupId=grp1
kafka.camelKafkaOptions.brokers=kafka.localtest:9093
kafka.camelKafkaOptions.consumersCount=10
kafka.camelKafkaOptions.autoOffsetReset=latest
kafka.camelKafkaOptions.autoCommitEnable=false
kafka.camelKafkaOptions.allowManualCommit=true
kafka.camelKafkaOptions.metadataMaxAgeMs=5000
kafka.camelKafkaOptions.securityProtocol=SSL
kafka.camelKafkaOptions.sslEndpointAlgorithm=HTTPS
kafka.camelKafkaOptions..sslKeyPassword=<ssl key password>
kafka.camelKafkaOptions..sslKeystoreLocation=<keystorepath>
kafka.camelKafkaOptions.sslKeystorePassword=<sslkeystore password>
kafka.camelKafkaOptions.sslTruststoreLocation=<truststore path>
kafka.camelKafkaOptions.sslTruststorePassword=<password>
and create a utility method, to construct a kafka url
@Component
public class KafkaUtility {
public String getKafkaEndpoint(String topicName ){
StringBuilder urlBuilder = new StringBuilder("kafka:" + topicName);
if (!getCamelKafkaOptions().isEmpty()) {
urlBuilder.append("&");
getCamelKafkaOptions().forEach(
(key, value) -> {
if (StringUtils.isNotBlank(value)) {
appendConfig(urlBuilder, key, value);
}
}
);
}
// strip the last "&" symbol
String kafkaURL = stripLastAnd(urlBuilder.toString());
return kafkaURL;
}
}
In your route builder, implement the below
@Autowired
private KafkaUtility kafkaUtility;
from(kafkaUtility.getKafkaEndpoint())
.process("yourprocessor")
.to("tourl");
#卡夫卡配置
kafka.topic=iot1
kafka.camelKafkaOptions.groupId=grp1
kafka.camelKafkaOptions.brokers=kafka.localtest:9093
kafka.camelKafkaOptions.consumersCount=10
kafka.camelKafkaOptions.autoOffsetReset=最新版本
kafka.camelKafkaOptions.autocommitteable=false
kafka.camelKafkaOptions.allowManualCommit=true
kafka.camelKafkaOptions.metadataMaxAgeMs=5000
kafka.camelKafkaOptions.securityProtocol=SSL
kafka.camelKafkaOptions.sslEndpointAlgorithm=HTTPS
卡夫卡。卡夫卡选项..sslKeyPassword=
卡夫卡。卡夫卡选项..sslKeystoreLocation=
kafka.camelKafkaOptions.sslKeystorePassword=
kafka.camelKafkaOptions.sslTruststoreLocation=
kafka.camelKafkaOptions.sslTruststorePassword=
并创建一个实用方法,以构造卡夫卡url
@组成部分
公共级卡夫卡{
公共字符串getKafkaEndpoint(字符串主题名){
StringBuilder urlBuilder=新的StringBuilder(“卡夫卡:+topicName”);
如果(!getCamelKafkaOptions().isEmpty()){
urlBuilder.append(“&”);
getCamelKafkaOptions().forEach(
(键、值)->{
if(StringUtils.isNotBlank(值)){
appendConfig(urlBuilder、键、值);
}
}
);
}
//去掉最后一个“&”符号
字符串kafkaull=stripLastAnd(urlBuilder.toString());
返回卡夫卡尔;
}
}
在管线生成器中,执行以下步骤
@自动连线
私人卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫卡夫;
from(kafkautability.getKafkaEndpoint())
.进程(“您的处理器”)
.至(“tourl”);
# kafka configuration
kafka.topic=iot1
kafka.camelKafkaOptions.groupId=grp1
kafka.camelKafkaOptions.brokers=kafka.localtest:9093
kafka.camelKafkaOptions.consumersCount=10
kafka.camelKafkaOptions.autoOffsetReset=latest
kafka.camelKafkaOptions.autoCommitEnable=false
kafka.camelKafkaOptions.allowManualCommit=true
kafka.camelKafkaOptions.metadataMaxAgeMs=5000
kafka.camelKafkaOptions.securityProtocol=SSL
kafka.camelKafkaOptions.sslEndpointAlgorithm=HTTPS
kafka.camelKafkaOptions..sslKeyPassword=<ssl key password>
kafka.camelKafkaOptions..sslKeystoreLocation=<keystorepath>
kafka.camelKafkaOptions.sslKeystorePassword=<sslkeystore password>
kafka.camelKafkaOptions.sslTruststoreLocation=<truststore path>
kafka.camelKafkaOptions.sslTruststorePassword=<password>
and create a utility method, to construct a kafka url
@Component
public class KafkaUtility {
public String getKafkaEndpoint(String topicName ){
StringBuilder urlBuilder = new StringBuilder("kafka:" + topicName);
if (!getCamelKafkaOptions().isEmpty()) {
urlBuilder.append("&");
getCamelKafkaOptions().forEach(
(key, value) -> {
if (StringUtils.isNotBlank(value)) {
appendConfig(urlBuilder, key, value);
}
}
);
}
// strip the last "&" symbol
String kafkaURL = stripLastAnd(urlBuilder.toString());
return kafkaURL;
}
}
In your route builder, implement the below
@Autowired
private KafkaUtility kafkaUtility;
from(kafkaUtility.getKafkaEndpoint())
.process("yourprocessor")
.to("tourl");