本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
客户端身份验证
您可以为从应用程序到 Amazon MSK 代理和 ZooKeeper 节点的连接启用 TLS 客户端身份验证。要使用客户端身份验证,您需要有 ACM Private
CA。有关私有 CAs 的信息,请参阅创建和管理私有 CA
TLS 身份验证目前在北京和宁夏区域中不可用。
本主题包含下列部分:
创建支持客户端身份验证的集群
此过程说明了如何使用 ACM 托管的 CA 启用客户端身份验证。
-
使用以下内容创建名为
clientauthinfo.json
的文件。ReplacePrivate-CA-ARN
替换为您的 PCA 的 ARN。{ "Tls": { "CertificateAuthorityArnList": ["
Private-CA-ARN
"] } } -
创建一个名为
brokernodegroupinfo.json
的文件,如使用 AWS CLI 创建集群中所述。 -
客户端身份验证还要求您启用客户端和代理之间的传输中加密。使用以下内容创建名为
encryptioninfo.json
的文件。ReplaceKMS-Key-ARN
替换为您的 KMS 密钥的 ARN。可以将ClientBroker
设置为TLS
或TLS_PLAINTEXT
。{ "EncryptionAtRest": { "DataVolumeKMSKeyId": "
KMS-Key-ARN
" }, "EncryptionInTransit": { "InCluster": true, "ClientBroker": "TLS" } }有关加密的更多信息,请参阅 Amazon MSK 加密。
-
在已安装 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
将客户端设置为使用身份验证
-
创建用作客户端计算机的 Amazon EC2 实例。为简单起见,请在用于集群的同一 VPC 中创建此实例。有关如何创建此类客户端计算机的示例,请参阅第4步: 创建客户机。
-
创建主题。有关示例,请参阅第5步: 创建主题下的说明。
-
在已安装 AWS CLI 的计算机上,运行以下命令以获取集群的引导代理。Replace
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
-
在客户端计算机上,运行以下命令为客户端创建私有密钥。Replace
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
(及其后面的单个空格)。 -
在已安装 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。
-
运行以下命令以获取 ACM 为您签名的证书。Replace
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
保存到的路径。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
使用身份验证生成和使用消息
-
运行以下命令以创建主题。
bin/kafka-topics.sh --create --zookeeper
ZooKeeper-Connection-String
--replication-factor 3 --partitions 1 --topic ExampleTopic -
运行以下命令以启动控制台生成器。名为
client.properties
的文件是您在上一过程中创建的文件。bin/kafka-console-producer.sh --broker-list
BootstrapBroker-String
--topic ExampleTopic --producer.config client.properties -
在客户端计算机上的新命令窗口中,运行以下命令以启动控制台使用器。
bin/kafka-console-consumer.sh --bootstrap-server
BootstrapBroker-String
--topic ExampleTopic --consumer.config client.properties -
在生成器窗口中键入消息,并观察消息显示在使用器窗口中。