docker - 引起: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 较新版本一起使用时,我有什么想法吗?
解决方案
推荐阅读
- html - 绝对 DIV 占用所有剩余高度
- mediawiki - mediawiki 嵌套多个函数(下划线)
- excel - 日期的宏检查 => 如果真正将行复制到第二张纸
- python - 熊猫数据框获取每组的第一行并复制到其他行
- html - 如何在 Thymeleaf 页面中显示 Angular 组件?
- angular - 如何在 Angular 中设置动态 HTML 数据?
- html - css 中的悬停样式不适用于我的按钮
- nativescript - 如何在 nativescript 中控制台表单数据
- java - 从 excel 读取数据单元格值
- apache-flink - 是否有一些好的开源连接器可以实现从 InfluxDB 到 Flink 的数据传输