对适用于 RabbitMQ 的亚马逊 MQ 使用 SSL 证书身份验证 - Amazon MQ
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

对适用于 RabbitMQ 的亚马逊 MQ 使用 SSL 证书身份验证

本教程介绍如何使用私有证书颁发机构为您的 Amazon MQ for RabbitMQ 代理配置 SSL 证书身份验证。

注意

SSL 证书身份验证插件仅适用于适用于 RabbitMQ 版本 4 及更高版本的亚马逊 MQ。

配置 SSL 证书身份验证的先决条件

SSL 证书身份验证使用双向 TLS (mTLS) 对使用 X.509 证书的客户端进行身份验证。您可以通过部署适用于 RabbitMQ mTLS 集成的亚马逊 MQ 的Amazon CDK 堆栈来设置本教程中所需的 Amazon 资源。

此 CDK 堆栈会自动创建所有必要的 Amazon 资源,包括证书颁发机构、客户端证书和 IAM 角色。有关堆栈创建的资源的完整列表,请参阅软件包自述文件。

注意

在部署 CDK 堆栈之前,请设置RABBITMQ_TEST_USER_NAME环境变量。此值将用作客户端证书中的公用名 (CN),并且必须与您在教程步骤中使用的用户名相匹配。例如:export RABBITMQ_TEST_USER_NAME="myuser"

如果您是手动设置资源而不是使用 CDK 堆栈,请确保在您的 Amazon MQ 上为 RabbitMQ 代理配置 SSL 证书身份验证之前,请确保您有同等的基础架构。

设置 Amazon MQ 的先决条件

Amazon CLI 版本 >= 2.28.23,使得在创建代理期间添加用户名和密码成为可选的。

使用 CLI 在 RabbitMQ 中配置 SSL 证书身份验证 Amazon

此过程使用 Amazon CLI 来创建和配置必要的资源。在以下过程中,请确保将占位符值(例如 ConfigurationID 和 Revision 和)替换为它们的实际值。<c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca> <2>

  1. 使用 create-configuration Amazon CLI 命令创建新配置,如以下示例所示。

    aws mq create-configuration \ --name "rabbitmq-ssl-config" \ --engine-type "RABBITMQ" \ --engine-version "4.2"

    此命令返回类似于以下示例的响应。

    { "Arn": "arn:aws:mq:us-west-2:123456789012:configuration:c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca", "AuthenticationStrategy": "simple", "Created": "2025-07-17T16:03:01.759943+00:00", "Id": "c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca", "LatestRevision": { "Created": "2025-07-17T16:03:01.759000+00:00", "Description": "Auto-generated default for rabbitmq-ssl-config on RabbitMQ 4.2", "Revision": 1 }, "Name": "rabbitmq-ssl-config" }
  2. 创建名rabbitmq.conf为使用 SSL 证书身份验证的配置文件,如以下示例所示。将模板中的所有占位符值(标有${...})替换为已部署的 Amazon CDK 先决条件堆栈输出或等效基础架构中的实际值。

    auth_mechanisms.1 = EXTERNAL ssl_cert_login_from = common_name auth_backends.1 = internal # Reject if no client cert ssl_options.verify = verify_peer ssl_options.fail_if_no_peer_cert = true # AWS integration for secure credential retrieval # For more information, see https://github.com/amazon-mq/rabbitmq-aws # FIXME: Replace the ${...} placeholders with actual ARN values # from your deployed prerequisite CDK stack outputs. aws.arns.assume_role_arn = ${AmazonMqAssumeRoleArn} aws.arns.ssl_options.cacertfile = ${CaCertArn}
  3. 使用 update-configuration Amazon CLI 命令更新配置,如以下示例所示。在此命令中,添加您在本过程步骤 1 的响应中收到的配置 ID。例如 c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca

    aws mq update-configuration \ --configuration-id "<c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca>" \ --data "$(cat rabbitmq.conf | base64 --wrap=0)"

    此命令返回类似于以下示例的响应。

    { "Arn": "arn:aws:mq:us-west-2:123456789012:configuration:c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca", "Created": "2025-07-17T16:57:04.520931+00:00", "Id": "c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca", "LatestRevision": { "Created": "2025-07-17T16:57:39.172000+00:00", "Revision": 2 }, "Name": "rabbitmq-ssl-config", "Warnings": [] }
  4. 使用您在本过程的步骤 2 中创建的 SSL 证书身份验证配置创建代理。为此,请使用 create-broker Amazon CLI 命令,如以下示例所示。在此命令中,分别提供您在步骤 1 和步骤 2 的响应中获得的配置 ID 和修订号。例如,c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca2

    aws mq create-broker \ --broker-name "rabbitmq-ssl-test-1" \ --engine-type "RABBITMQ" \ --engine-version "4.2" \ --host-instance-type "mq.m7g.large" \ --deployment-mode "SINGLE_INSTANCE" \ --logs '{"General": true}' \ --publicly-accessible \ --configuration '{"Id": "<c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca>","Revision": <2>}' \ --users '[{"Username":"testuser","Password":"testpassword"}]'

    此命令返回类似于以下示例的响应。

    { "BrokerArn": "arn:aws:mq:us-west-2:123456789012:broker:rabbitmq-ssl-test-1:b-2a1b5133-a10c-49d2-879b-8c176c34cf73", "BrokerId": "b-2a1b5133-a10c-49d2-879b-8c176c34cf73" }
  5. 使用 describe-broker Amazon CLI 命令验证代理的状态是否从CREATION_IN_PROGRESS转换为RUNNING,如以下示例所示。在此命令中,提供您在上一步的结果中获得的经纪人 ID。例如 b-2a1b5133-a10c-49d2-879b-8c176c34cf73

    aws mq describe-broker \ --broker-id "<b-2a1b5133-a10c-49d2-879b-8c176c34cf73>"

    此命令返回类似于以下示例的响应。以下响应是 describe-broker 命令返回的完整输出的缩写版本。此响应显示代理状态以及用于保护代理的认证策略。在这种情况下,config_managed身份验证策略表明代理使用 SSL 证书身份验证方法。

    { "AuthenticationStrategy": "config_managed", ..., "BrokerState": "RUNNING", ... }
  6. 使用以下ssl.sh脚本验证 SSL 证书身份验证。

    使用此 bash 脚本测试与您的 Amazon MQ for RabbitMQ 代理的连接性。此脚本使用您的客户端证书进行身份验证,并验证连接配置是否正确。如果配置成功,您将看到您的代理发布和使用消息。

    如果您收到ACCESS_REFUSED错误,则可以使用代理的 CloudWatch 日志对配置设置进行故障排除。您可以在 Amazon MQ 控制台中找到您的代理的 CloudWatch 日志组链接。

    在此脚本中,您需要提供以下值:

    • USERNAME:您的客户证书中的常用名 (CN)。

    • CLIENT_KEYSTORE:您的客户端密钥库文件的路径(PKCS12 格式)。如果您使用了必备的 CDK 堆栈,则默认路径为$(pwd)/certs/client-keystore.p12

    • KEYSTORE_PASSWORD: 您的客户端密钥库的密码。如果您使用了必备的 CDK 堆栈,则默认密码为changeit

    • BROKER_DNS:您可以在 Amazon MQ 控制台的代理详情页面的 “连接” 下找到此值。

    #! /bin/bash set -e # Client information ## FIXME: Update this value with the client ID and secret of your confidential application client USERNAME=<client_cert_common_name> CLIENT_KEYSTORE=$(pwd)/certs/client-keystore.p12 KEYSTORE_PASSWORD=changeit BROKER_DNS=<broker_dns> CONNECTION_STRING=amqps://${BROKER_DNS}:5671 # Produce/consume messages using the above connection string QUEUES_COUNT=1 PRODUCERS_COUNT=1 CONSUMERS_COUNT=1 PRODUCER_RATE=1 finch run --rm --ulimit nofile=40960:40960 \ -v ${CLIENT_KEYSTORE}:/certs/client-keystore.p12:ro \ -e JAVA_TOOL_OPTIONS="-Djavax.net.ssl.keyStore=/certs/client-keystore.p12 -Djavax.net.ssl.keyStorePassword=${KEYSTORE_PASSWORD} -Djavax.net.ssl.keyStoreType=PKCS12" \ pivotalrabbitmq/perf-test:latest \ --queue-pattern 'test-queue-cert-%d' --queue-pattern-from 1 --queue-pattern-to $QUEUES_COUNT \ --producers $PRODUCERS_COUNT --consumers $CONSUMERS_COUNT \ --id "cert-test${QUEUES_COUNT}q${PRODUCERS_COUNT}p${CONSUMERS_COUNT}c${PRODUCER_RATE}r" \ --uri ${CONNECTION_STRING} \ --sasl-external \ --use-default-ssl-context \ --flag persistent --rate $PRODUCER_RATE