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

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

双向 TLS 身份验证

对于从应用程序到 Amazon MSK 代理和 ZooKeeper 节点的连接,您可以使用 TLS 启用客户端身份验证。要使用客户端身份验证,您需要有 Amazon 私有 CA。 Amazon 私有 CA 可以与您的集群位于 Amazon Web Services 账户 同一个账户中,也可以位于不同的账户中。有关 Amazon 私有 CAs 的信息,请参阅创建和管理 Amazon 私有 CA

注意

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

Amazon MSK 不支持证书吊销列表(CRL)。要控制对集群主题的访问权限或屏蔽已泄露的证书,请使用 Apache Kafka ACL 和 Amazon 安全组。有关使用 Apache Kafka ACL 的信息,请参阅 Apache Kafka ACL

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

此过程向您展示如何使用启用客户端身份验证 Amazon 私有 CA。

注意

在使用双向 TLS 控制访问时,我们强烈建议 Amazon 私有 CA 对每个 MSK 集群使用独立模式。这样做可以确保由 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 "{YOUR KAFKA VERSION}" --number-of-broker-nodes 3

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

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

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

  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。

    注意

    要检索您的客户端证书,请使用 acm-pca get-certificate 命令并指定您的证书 ARN。有关更多信息,请参阅《Amazon CLI Command Reference》中的 get-certificate

  9. 运行以下命令获取为您 Amazon 私有 CA 签名的证书。将 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 保存到的路径。用您的 Kafka 客户端版本替换 {YOUR KAFKA VERSION} 占位符。

    security.protocol=SSL ssl.truststore.location=/tmp/kafka_2.12-{YOUR KAFKA VERSION}/kafka.client.truststore.jks ssl.keystore.location=/tmp/kafka_2.12-{YOUR KAFKA VERSION}/kafka.client.keystore.jks ssl.keystore.password=Your-Store-Pass ssl.key.password=Your-Key-Pass

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

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

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

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

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