【问题标题】:Kafka SSL Authentication Issues for inter-broker communication用于代理间通信的 Kafka SSL 身份验证问题
【发布时间】:2019-05-16 13:27:04
【问题描述】:

我目前正在使用 SSL 身份验证配置 Apache Kafka,并且在启动服务时遇到错误。似乎代理启动正确(似乎发生了领导选举等),但是一旦任何集群操作开始发生,我就会在日志中不断收到以下错误。

    [2019-05-16 11:04:00,351] INFO [Controller id=1, targetBrokerId=1] Failed authentication with XXXX/YYYY (SSL handshake failed) (org.apache.kafka.common.network.Selector)
[2019-05-16 11:04:00,351] DEBUG [Controller id=1, targetBrokerId=1] Node 1 disconnected. (org.apache.kafka.clients.NetworkClient)
[2019-05-16 11:04:00,351] DEBUG An authentication error occurred in broker-to-broker communication. (org.apache.kafka.clients.ManualMetadataUpdater)
org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
Caused by: javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 2

尝试重新创建密钥和信任存储,尝试从代理间侦听器中删除 SSL(这会导致我不想授予对任何资源的访问权限的匿名主体)。

解释一下我的配置:

  • 使用 SSL 主体构建器运行 Kafka 2.2
  • 我设置了 3 个侦听器 - 一个在公共接口上,两个在私有接口上(一个用于代理间通信,一个用于内部消费者)
  • 所有 3 个侦听器都启用了 SSL
  • 每个侦听器都绑定到它自己的密钥和信任存储(因为我需要能够为内部地址提供不同的证书,以及能够信任不同的签名 CA),并为每个侦听器提供 SSL 密钥密码密钥/密钥库。
  • 证书是使用本地生成的密钥创建的,本地 CSR 生成然后由在 CFSSL 多根上运行的 CA 签名。
  • 然后使用导入的密钥(相同密码)、签名证书和 CA 证书创建密钥库。
  • 已创建信任库并在此处添加了证书颁发 CA。
#Kafka Server Properties Configuration
#Broker and listener configuration
broker.id=1
listeners=egress://address1:9093,inter://address1:9094,ingest://address2:9092
advertised.listeners=egress://address1:9093,inter://address1:9094,ingest://address2:9092
listener.security.protocol.map=egress:SSL,inter:SSL,ingest:SSL
inter.broker.listener.name=inter
##
#Listener Trust and Keystore Configurations
#egress configuration
listener.name.egress.ssl.keystore.type=JKS
listener.name.egress.ssl.keystore.location=/data/kafka/pki/egress-keystore.jks
listener.name.egress.ssl.keystore.password=<redacted>
listener.name.egress.ssl.truststore.type=JKS
listener.name.egress.ssl.truststore.location=/data/kafka/pki/egress-truststore.jks
listener.name.egress.ssl.truststore.password=<redacted>
listener.name.egress.ssl.key.password=<redacted>
listener.name.egress.ssl.client.auth=required
listener.name.egress.ssl.principal.mapping.rules=RULE:^.*[Oo][Uu]=([a-zA-Z0-9.-]*).*$/$1/L,DEFAULT
##
#inter configuration
listener.name.inter.ssl.keystore.type=JKS
listener.name.inter.ssl.keystore.location=/data/kafka/pki/inter-keystore.jks
listener.name.inter.ssl.keystore.password=<redacted>
listener.name.inter.ssl.truststore.type=JKS
listener.name.inter.ssl.truststore.location=/data/kafka/pki/inter-truststore.jks
listener.name.inter.ssl.truststore.password=<redacted>
listener.name.inter.ssl.key.password=<redacted>
listener.name.inter.ssl.client.auth=requested
listener.name.inter.ssl.principal.mapping.rules=RULE:^.*[Oo][Uu]=([a-zA-Z0-9.-]*).*$/$1/L,DEFAULT
##
#ingest configuration
listener.name.ingest.ssl.keystore.type=JKS
listener.name.ingest.ssl.keystore.location=/data/kafka/pki/ingest-keystore.jks
listener.name.ingest.ssl.keystore.password=<redacted>
listener.name.ingest.ssl.truststore.type=JKS
listener.name.ingest.ssl.truststore.location=/data/kafka/pki/ingest-truststore.jks
listener.name.ingest.ssl.truststore.password=<redacted>
listener.name.ingest.ssl.key.password=<redacted>
listener.name.ingest.ssl.client.auth=required
listener.name.ingest.ssl.principal.mapping.rules=RULE:^.*[Oo][Uu]=([a-zA-Z0-9.-]*).*$/$1/L,DEFAULT
##

#Generic SSL Configuration
ssl.keystore.type=JKS
ssl.keystore.location=/data/kafka/pki/inter-keystore.jks
ssl.keystore.password=<redacted>
ssl.truststore.type=JKS
ssl.truststore.location=/data/kafka/pki/inter-truststore.jks
ssl.truststore.password=<redacted>
ssl.key.password=<redacted>
ssl.client.auth=requested
ssl.principal.mapping.rules=RULE:^.*[Oo][Uu]=([a-zA-Z0-9.-]*).*$/$1/L,DEFAULT
ssl.enabled.protocols=TLSv1.2
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:<redacted>
##
#General configuration
auto.create.topics.enable=False
delete.topic.enable=True
log.dir=/var/log/kafka
log.retention.hours=24
log.cleaner.enable=True
log.cleanup.policy=delete
log.retention.check.interval.ms=3600000
min.insync.replicas=2
replication.factor=3
default.replication.factor=3
num.partitions=50
offsets.topic.num.partitions=50
offsets.topic.replication.factor=3
transaction.state.log.min.isr=2
transaction.state.log.num.partitions=50
num.replica.fetchers=4
auto.leader.rebalance.enable=True
leader.imbalance.check.interval.seconds=60
transactional.id.expiration.ms=10000
unclean.leader.election.enable=False
zookeeper.connect=zookeeper:2180
zookeeper.session.timeout.ms=100
controlled.shutdown.enable=True
broker.rack=rack1

【问题讨论】:

  • 您确保证书有效吗?看到这个答案:stackoverflow.com/a/50251363/6356
  • 证书有效。如果我关闭身份验证,但保留主机验证,一切似乎都可以工作......这意味着 SSL 主体映射可能存在问题,或者仅仅是 Kafka 不信任颁发的证书?信任库看起来也不错
  • 我遇到了同样的问题,SSL 工作正常,打开 ACL 并授权客户端应用程序,但即使设置了 ClusterAction,节点也无法相互授权

标签: ssl apache-kafka


【解决方案1】:

您是否按照您描述的顺序将证书插入密钥库?首先设置 ca,然后设置 ca 签名的证书以正确获取信任链可能很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2011-11-12
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多