

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

# 对适用于 RabbitMQ 的亚马逊 MQ 使用 SSL 证书身份验证
<a name="rabbitmq-ssl-tutorial"></a>

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

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

**Topics**
+ [配置 SSL 证书身份验证的先决条件](#rabbitmq-ssl-tutorial-prerequisites)
+ [使用 CLI 在 RabbitMQ 中配置 SSL 证书身份验证 AWS](#rabbitmq-ssl-tutorial-configure-cli)

## 配置 SSL 证书身份验证的先决条件
<a name="rabbitmq-ssl-tutorial-prerequisites"></a>

SSL 证书身份验证使用双向 TLS (mTLS) 对使用 X.509 证书的客户端进行身份验证。您可以通过部署[适用于 RabbitMQ mTLS 集成的亚马逊 MQ 的AWS CDK 堆栈](https://github.com/aws-samples/amazon-mq-samples/blob/main/rabbitmq-samples/rabbitmq-mtls-sample/)来设置本教程中所需的 AWS 资源。

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

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

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

### 设置 Amazon MQ 的先决条件
<a name="rabbitmq-ssl-tutorial-prerequisite-cli"></a>

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

## 使用 CLI 在 RabbitMQ 中配置 SSL 证书身份验证 AWS
<a name="rabbitmq-ssl-tutorial-configure-cli"></a>

此过程使用 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"
   }
   ```

1. 创建名`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}
   ```

1. 使用 `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": []
   }
   ```

1. 使用您在本过程的步骤 2 中创建的 SSL 证书身份验证配置创建代理。为此，请使用 `create-broker` AWS CLI 命令，如以下示例所示。在此命令中，分别提供您在步骤 1 和步骤 2 的响应中获得的配置 ID 和修订号。例如，`c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca` 和 `2`。

   ```
   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"
   }
   ```

1. 使用 `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",
       ...
   }
   ```

1. 使用以下`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
   ```