首页 > 解决方案 > 引起:javax.net.ssl.SSLHandshakeException:不存在主题替代名称 - KSQL Docker

问题描述

我有一个正在运行的 Kafka 集群,其中包含 3 个代理、3 个动物园管理员、模式注册表、kafka 连接、KSQL。KSQL 在 Docker 容器中运行。我使用的图像是 confluentinc/ksqldb-server:0.15.0。一切都在运行,没有任何问题。

现在我想将 KSQL 升级到更新的版本。为此,我想使用 confluentinc/ksqldb-server:0.20.0 映像。我停止并删除现有容器并使用新图像执行“docker run”。这是命令:

docker run --name my_name -h my_private_dns_name --ulimit nofile=65536:65536 --restart=on-failure:3 --log-opt max-size=100m --log-opt max-file=5 -d -p 8088:8088 -v /usr/share/docker_workspace_test:/usr/share/docker_workspace_test --user "$(id -u):$(id -g)" --env-file /usr/share/docker_workspace_test/config/ksql-server.environment confluentinc/ksqldb-server:0.20.0

容器开始运行,但几秒钟后退出。

'docker logs <CONTAINER_ID>' 命令输出显示:

===> Configuring ksqlDB...
===> Launching ksqlDB Server...
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
log4j:ERROR Could not find value for key log4j.appender.clients
log4j:ERROR Could not instantiate appender named "clients".
log4j:ERROR Could not find value for key log4j.appender.connect
log4j:ERROR Could not instantiate appender named "connect".
...
Caused by: org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
Caused by: javax.net.ssl.SSLHandshakeException: No subject alternative names present
        ...
Caused by: java.security.cert.CertificateException: No subject alternative names present
        ... 19 more

一旦我带回 confluentinc/ksqldb-server:0.15.0 图像并执行相同的命令,但使用此图像一切正常。

Kafka 组件之间的通信是 TLS 加密的。以下是步骤。

第 1 步:我生成一个像这样的自签名证书和密钥

openssl req -new -x509 -keyout ca-key -out ca-cert -days 365 -subj "/CN={{this_service.domain}}/O={{this_service.o}}/OU={{this_service.ou}}/C={{this_service.c}}/L={{this_service.l}}" -passout stdin

第 2 步:将其导入 server.truststore.jks

第 3 步:在应该运行 KSQL 容器的服务器上,我执行以下操作

keytool -keystore ksql.keystore.jks -genkey -alias {{private_dns_name}} -validity 365 -dname "CN={{private_dns_name}}, OU={{keys.ou}}, O={{keys.o}}, L={{keys.l}}, S={{keys.st}}, C={{keys.c}}" -keyalg RSA -ext SAN=DNS:{{private_dns_name}},IP:{{inventory_hostname}} -storepass:env KSPASSWORD -keypass:env KSPASSWORD -noprompt

第 4 步:我从创建的 ksql.keystore.jks 导出未签名的证书(第 3 步)

keytool -keystore ksql.keystore.jks -alias {{private_dns_name}} -certreq -file cert-file -storepass:env KSPASSWORD

并在步骤 1 的 ca-cert 和 ca-key 的帮助下签名

openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial -passin stdin

第 5 步:之后,我将签名证书“​​cert-signed”和“ca-cert”一起导入到 ksql.keystore.jks

在 Kafka Broker 端,我保存了步骤 2 中的 server.trustore.jks,其中已经包含所需的 ca-cert。

在将 docker 映像与 KSQL 较新版本一起使用时,我有什么想法吗?

标签: dockersslapache-kafkaksqldb

解决方案


推荐阅读