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

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

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

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

注意

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

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

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

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

注意

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

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

设置 Amazon MQ 的先决条件

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

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

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

  1. 使用 create-configuration AWS 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 证书身份验证的配置文件,如以下示例所示。将模板中的所有占位符值(标有${...})替换为已部署的 AWS 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 AWS 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 AWS 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 AWS 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