本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
双向 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 集群中进行身份验证。
-
使用以下内容创建名为
clientauthinfo.json
的文件。将Private-CA-ARN
替换为您的 PCA 的 ARN。{ "Tls": { "CertificateAuthorityArnList": ["
Private-CA-ARN
"] } } -
创建一个名为
brokernodegroupinfo.json
的文件,如使用 Amazon CLI 创建集群中所述。 -
客户端身份验证还要求您启用客户端和代理之间的传输中加密。使用以下内容创建名为
encryptioninfo.json
的文件。将KMS-Key-ARN
替换为您的 KMS 密钥的 ARN。可以将ClientBroker
设置为TLS
或TLS_PLAINTEXT
。{ "EncryptionAtRest": { "DataVolumeKMSKeyId": "
KMS-Key-ARN
" }, "EncryptionInTransit": { "InCluster": true, "ClientBroker": "TLS" } }有关加密的更多信息,请参阅Amazon MSK 加密。
-
在 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
将客户端设置为使用身份验证
-
创建用作客户端计算机的 Amazon EC2 实例。为简单起见,请在用于集群的同一 VPC 中创建此实例。有关如何创建此类客户端计算机的示例,请参阅步骤 3:创建客户端计算机。
-
创建主题。有关示例,请参阅步骤 4:创建主题下的说明。
-
在已 Amazon CLI 安装的计算机上,运行以下命令以获取集群的引导代理。将
Cluster-ARN
替换为您的集群的 ARN。aws kafka get-bootstrap-brokers --cluster-arn
Cluster-ARN
保存与响应中的
BootstrapBrokerStringTls
关联的字符串。 -
在客户端计算机上,运行以下命令以使用 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
-
在客户端计算机上,运行以下命令为客户端创建私有密钥。将
Distinguished-Name
、Example-Alias
、Your-Store-Pass
和Your-Key-Pass
替换为所选字符串。keytool -genkey -keystore kafka.client.keystore.jks -validity 300 -storepass
Your-Store-Pass
-keypassYour-Key-Pass
-dname "CN=Distinguished-Name
" -aliasExample-Alias
-storetype pkcs12 -
在客户端计算机上,运行以下命令以使用您在上一步中创建的私有密钥创建证书请求。
keytool -keystore kafka.client.keystore.jks -certreq -file client-cert-sign-request -alias
Example-Alias
-storepassYour-Store-Pass
-keypassYour-Key-Pass
-
打开
client-cert-sign-request
文件,并确保该文件的开头为-----BEGIN CERTIFICATE REQUEST-----
且结尾为-----END CERTIFICATE REQUEST-----
。如果该文件的开头为-----BEGIN NEW CERTIFICATE REQUEST-----
,请从文件的开头和结尾处删除单词NEW
(及其后面的单个空格)。 -
在已 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。 -
运行以下命令获取为您 Amazon 私有 CA 签名的证书。将
Certificate-ARN
替换为您从上一条命令的响应中获取的 ARN。aws acm-pca get-certificate --certificate-authority-arn
Private-CA-ARN
--certificate-arnCertificate-ARN
-
从运行上一条命令所获得的 JSON 结果中,复制与
Certificate
和CertificateChain
关联的字符串。将这两个字符串粘贴到名为的新文件中 signed-certificate-from-acm。先粘贴与Certificate
关联的字符串,然后粘贴与CertificateChain
关联的字符串。将\n
字符替换为新行。以下是将证书和证书链粘贴到其中之后的文件结构。-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
-
在客户端计算机上运行以下命令将此证书添加到您的密钥库中,以便能在与 MSK 代理交流时出示此证书。
keytool -keystore kafka.client.keystore.jks -import -file signed-certificate-from-acm -alias
Example-Alias
-storepassYour-Store-Pass
-keypassYour-Key-Pass
-
使用以下内容创建名为
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
使用身份验证生成和使用消息
-
运行以下命令以创建主题。
<path-to-your-kafka-installation>
/bin/kafka-topics.sh --create --zookeeperZooKeeper-Connection-String
--replication-factor 3 --partitions 1 --topic ExampleTopic -
运行以下命令以启动控制台生成器。名为
client.properties
的文件是您在上一过程中创建的文件。<path-to-your-kafka-installation>
/bin/kafka-console-producer.sh --broker-listBootstrapBroker-String
--topic ExampleTopic --producer.config client.properties -
在客户端计算机上的新命令窗口中,运行以下命令以启动控制台使用器。
<path-to-your-kafka-installation>
/bin/kafka-console-consumer.sh --bootstrap-serverBootstrapBroker-String
--topic ExampleTopic --consumer.config client.properties -
在生成器窗口中键入消息,并观察消息显示在使用器窗口中。