客户端身份验证 - Amazon Managed Streaming for Apache Kafka
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

客户端身份验证

您可以为从应用程序到 Amazon MSK 代理和 ZooKeeper 节点的连接启用 TLS 客户端身份验证。要使用客户端身份验证,您需要有 ACM Private CA。有关私有 CAs 的信息,请参阅创建和管理私有 CA

注意

TLS 身份验证目前在北京和宁夏区域中不可用。

创建支持客户端身份验证的集群

此过程说明了如何使用 ACM 托管的 CA 启用客户端身份验证。

  1. 使用以下内容创建名为 clientauthinfo.json 的文件。Replace Private-CA-ARN 替换为您的 PCA 的 ARN。

    { "Tls": { "CertificateAuthorityArnList": ["Private-CA-ARN"] } }
  2. 创建一个名为 brokernodegroupinfo.json 的文件,如使用 AWS CLI 创建集群中所述。

  3. 客户端身份验证还要求您启用客户端和代理之间的传输中加密。使用以下内容创建名为 encryptioninfo.json 的文件。Replace KMS-Key-ARN 替换为您的 KMS 密钥的 ARN。可以将 ClientBroker 设置为 TLSTLS_PLAINTEXT

    { "EncryptionAtRest": { "DataVolumeKMSKeyId": "KMS-Key-ARN" }, "EncryptionInTransit": { "InCluster": true, "ClientBroker": "TLS" } }

    有关加密的更多信息,请参阅 Amazon MSK 加密

  4. 在已安装 AWS CLI 的计算机上,运行以下命令以创建启用了身份验证和传输加密的集群。保存响应中提供的集群 ARN。

    aws kafka create-cluster --cluster-name "AuthenticationTest" --broker-node-group-info file://brokernodegroupinfo.json --encryption-info file://encryptioninfo.json --client-authentication file://clientauthinfo.json --kafka-version "2.2.1" --number-of-broker-nodes 3

将客户端设置为使用身份验证

  1. 创建用作客户端计算机的 Amazon EC2 实例。为简单起见,请在用于集群的同一 VPC 中创建此实例。有关如何创建此类客户端计算机的示例,请参阅第4步: 创建客户机

  2. 创建主题。有关示例,请参阅第5步: 创建主题下的说明。

  3. 在已安装 AWS CLI 的计算机上,运行以下命令以获取集群的引导代理。Replace Cluster-ARN 替换为您的集群的 ARN。

    aws kafka get-bootstrap-brokers --cluster-arn Cluster-ARN

    保存与响应中的 BootstrapBrokerStringTls 关联的字符串。

  4. 在客户端计算机上,运行以下命令以使用 JVM 信任存储来创建客户端信任存储。如果您的 JVM 路径不同,请相应地调整命令。

    cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64/jre/lib/security/cacerts kafka.client.truststore.jks
  5. 在客户端计算机上,运行以下命令为客户端创建私有密钥。Replace Distinguished-Name, Example-Alias, Your-Store-Pass, 和 Your-Key-Pass 替换为您选择的字符串。

    keytool -genkey -keystore kafka.client.keystore.jks -validity 300 -storepass Your-Store-Pass -keypass Your-Key-Pass -dname "CN=Distinguished-Name" -alias Example-Alias -storetype pkcs12
  6. 在客户端计算机上,运行以下命令以使用您在上一步中创建的私有密钥创建证书请求。

    keytool -keystore kafka.client.keystore.jks -certreq -file client-cert-sign-request -alias Example-Alias -storepass Your-Store-Pass -keypass Your-Key-Pass
  7. 打开 client-cert-sign-request 文件,并确保它以 -----BEGIN CERTIFICATE REQUEST----- 开头并以 -----END CERTIFICATE REQUEST----- 结尾。 如果该文件以 -----BEGIN NEW CERTIFICATE REQUEST----- 开头,请从文件的开头和结尾删除单词 NEW(及其后面的单个空格)。

  8. 在已安装 AWS CLI 的计算机上,运行以下命令以对证书请求进行签名。Replace Private-CA-ARN 替换为您的 PCA 的 ARN。如果需要,您可以更改有效性值。在这里,我们以 300 为例。

    aws acm-pca issue-certificate --certificate-authority-arn Private-CA-ARN --csr file://client-cert-sign-request --signing-algorithm "SHA256WITHRSA" --validity Value=300,Type="DAYS"

    保存响应中提供的证书 ARN。

  9. 运行以下命令以获取 ACM 为您签名的证书。Replace Certificate-ARN 替换为您从上一个命令的响应中获取的 ARN。

    aws acm-pca get-certificate --certificate-authority-arn Private-CA-ARN --certificate-arn Certificate-ARN
  10. 从运行上一命令的 JSON 结果中,复制与 CertificateCertificateChain 关联的字符串。 将这两个字符串粘贴到名为 signed-certificate-from-acm 的新文件中。首先粘贴与 Certificate 关联的字符串,后跟与 CertificateChain 关联的字符串。 将 \n 字符替换为新行。以下是将证书和证书链粘贴到其中之后的文件结构。

    -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
  11. 在客户端计算机上运行以下命令将此证书添加到您的密钥库中,以便能在与 MSK 代理交流时出示此证书。

    keytool -keystore kafka.client.keystore.jks -import -file signed-certificate-from-acm -alias Example-Alias -storepass Your-Store-Pass -keypass Your-Key-Pass
  12. 使用以下内容创建名为 client.properties 的文件。将信任存储和密钥库位置调整为您将 kafka.client.truststore.jks 保存到的路径。

    security.protocol=SSL ssl.truststore.location=/tmp/kafka_2.12-2.2.1/kafka.client.truststore.jks ssl.keystore.location=/tmp/kafka_2.12-2.2.1/kafka.client.keystore.jks ssl.keystore.password=Your-Store-Pass ssl.key.password=Your-Key-Pass

使用身份验证生成和使用消息

  1. 运行以下命令以创建主题。

    bin/kafka-topics.sh --create --zookeeper ZooKeeper-Connection-String --replication-factor 3 --partitions 1 --topic ExampleTopic
  2. 运行以下命令以启动控制台生成器。名为 client.properties 的文件是您在上一过程中创建的文件。

    bin/kafka-console-producer.sh --broker-list BootstrapBroker-String --topic ExampleTopic --producer.config client.properties
  3. 在客户端计算机上的新命令窗口中,运行以下命令以启动控制台使用器。

    bin/kafka-console-consumer.sh --bootstrap-server BootstrapBroker-String --topic ExampleTopic --consumer.config client.properties
  4. 在生成器窗口中键入消息,并观察消息显示在使用器窗口中。