

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 針對 Amazon MQ for RabbitMQ 使用 SSL 憑證身分驗證
<a name="rabbitmq-ssl-tutorial"></a>

本教學課程說明如何使用私有憑證授權機構設定 Amazon MQ for RabbitMQ 代理程式的 SSL 憑證驗證。

**注意**  
SSL 憑證身分驗證外掛程式僅適用於 Amazon MQ for RabbitMQ 第 4 版及更高版本。

**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 憑證的用戶端。您可以部署 [AWS Amazon MQ for RabbitMQ mTLS 整合的 CDK 堆疊](https://github.com/aws-samples/amazon-mq-samples/blob/main/rabbitmq-samples/rabbitmq-mtls-sample/)，藉此設定本教學課程中所需的 AWS 資源。

此 CDK 堆疊會自動建立所有必要 AWS 的資源，包括憑證授權單位、用戶端憑證和 IAM 角色。如需堆疊所建立資源的完整清單，請參閱套件 README。

**注意**  
部署 CDK 堆疊之前，請設定 `RABBITMQ_TEST_USER_NAME`環境變數。此值將用作用戶端憑證中的通用名稱 (CN)，並且必須符合您在教學課程中使用的使用者名稱。例如：`export RABBITMQ_TEST_USER_NAME="myuser"`

如果您要手動設定資源，而不是使用 CDK 堆疊，請確保在 Amazon MQ for 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`<2>`，`<c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca>`以及 。

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