本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
双向 TLS 身份验证
对于从应用程序到 Amazon MSK 代理的连接,您可以使用 TLS 启用客户端身份验证。要使用客户端身份验证,您需要有 Amazon 私有 CA。 Amazon 私有 CA 可以与您的集群位于 Amazon Web Services 账户 同一个账户中,也可以位于不同的账户中。有关 Amazon 私有 CA s 的信息,请参阅创建和管理 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
使用身份验证生成和使用消息
-
运行以下命令以创建主题。名为
client.properties
的文件是您在上一过程中创建的文件。<path-to-your-kafka-installation>
/bin/kafka-topics.sh --create --bootstrap-serverBootstrapBroker-String
--replication-factor 3 --partitions 1 --topic ExampleTopic --command-config client.properties -
运行以下命令以启动控制台生成器。名为
client.properties
的文件是您在上一过程中创建的文件。<path-to-your-kafka-installation>
/bin/kafka-console-producer.sh --bootstrap-serverBootstrapBroker-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 -
在生成器窗口中键入消息,并观察消息显示在使用器窗口中。