双向 TLS 验证 - Amazon Managed Streaming for Apache Kafka
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

双向 TLS 验证

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

注意

TLS 身份验证目前不在北京和宁夏区域提供。

Amazon MSK 不支持证书吊销列表 (CRL)。要控制对集群主题的访问或阻止受损证书,请使用 Apache Kafka ACL 和Amazon安全组。有关使用 Apache Kafka ACL 的信息,请参阅。Apache Kafka ACL.

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

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

注意

当您使用双向 TLS 控制访问时,我们强烈建议为每个 MSK 群集使用独立的 ACM PCA。这样做将确保 PCA 签名的 TLS 证书只能使用单个 MSK 集群进行身份验证。

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

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

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

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

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

  4. 在已安装 Amazon 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. 在已安装 Amazon CLI 的计算机上,运行以下命令以获取集群的引导代理。将 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. 在客户端计算机上,运行以下命令为客户端创建私有密钥。将 Distinguished-NameExample-AliasYour-Store-PassYour-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. 在已安装 Amazon CLI 的计算机上,运行以下命令以对证书请求进行签名。将 Private-CA-ARN 替换为您的 PCA 的 ARN。如果需要,您可以更改有效性值。在这里,我们以 300 为例。

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

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

  9. 运行以下命令以获取 ACM 为您签名的证书。将 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. 在生成器窗口中键入消息,并观察消息显示在使用器窗口中。