我正在尝试使用 AWS 托管的 Kafka 实例 (MSK) 创建一个 Kafka 客户端应用程序(生产者和消费者)。代理到代理的通信和客户端到代理的通信也通过集群中的 TLS 配置为安全的。CA 是 AWS 私有 CA,因为这是 MSK 唯一支持客户端通过 TLS 进行代理身份验证的 CA。
问题背景:AWS 官方文档 ( https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html#msk-authentication-client ) 步骤更倾向于 Java 世界并处理客户端信任库和作为 jks 的密钥库。但是 .Net 客户端不使用 Java JKS 容器格式(https://github.com/mhowlett/confluent-kafka-dotnet/tree/security/examples/Security)。
服务器身份验证客户端:这部分我能够解决。由于 jks 只是一个数据存储,因此在按照上面的 aws doc 创建 Keystore 之后,我运行了一些额外的 keytool 和 openssl 命令来显式提取客户端证书和密钥。我能够使用它成功地生成和使用消息。
但是,为了让客户端验证服务器,我需要将 ssl.ca.location 设置为 CA 根证书。从私有 CA(用作 MSK 实例的 CA)我已经下载了默认为 pem 格式的根 CA(注意:这仅包含证书详细信息,没有密钥详细信息)。使用以下命令将其转换为 .crt:
add pem to truststore : keytool -keystore kafka.client.truststore.jks -alias CARoot -importcert -file Certificate.pem
get cert from truststore : keytool -export -alias CARoot -keystore kafka.client.truststore.jks -rfc -file ca-root.crt
将上述 ca-root.crt 用于 ca 位置似乎不起作用。它抛出错误代理验证失败。客户端机器是 Windows,但这应该不是问题,因为除了通过证书位置 ssl.ca.location 我还尝试在机器中安装证书但仍然没有运气。我看到以下错误:
SSL handshake failed: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed: broker certificate could not be verified, verify that ssl.ca.location is correctly configured or root CA certificates are installed
我是否缺少客户端验证服务器部分的内容?
更新:我也能够解决代理验证问题。以上官方 AWS 文档依赖 Java 证书进行 Broker 验证身份验证。我对其进行了扩展以从 jks 派生 perm 和进一步的 .crt,并将生成的 .crt 用作 ssl.ca.location 的 CA,并且它可以工作。但是,生成的证书中有太多证书,并且不清楚哪个证书用于验证 MSK 代理证书。另外为什么从私有 AWS CA 下载的 CA 证书不起作用?如果有人可以在这些方面提供帮助,那将非常有帮助。还请建议是否有针对该问题的替代标准解决方案。