

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# RabbitMQ용 Amazon MQ에 SSL 인증서 인증 사용
<a name="rabbitmq-ssl-tutorial"></a>

이 자습서에서는 프라이빗 인증 기관을 사용하여 RabbitMQ용 Amazon MQ 브로커에 대한 SSL 인증서 인증을 구성하는 방법을 설명합니다.

**참고**  
SSL 인증서 인증 플러그인은 RabbitMQ용 Amazon MQ 버전 4 이상에서만 사용할 수 있습니다. RabbitMQ 

**Topics**
+ [SSL 인증서 인증을 구성하기 위한 사전 조건](#rabbitmq-ssl-tutorial-prerequisites)
+ [AWS CLI를 사용하여 RabbitMQ에서 SSL 인증서 인증 구성](#rabbitmq-ssl-tutorial-configure-cli)

## SSL 인증서 인증을 구성하기 위한 사전 조건
<a name="rabbitmq-ssl-tutorial-prerequisites"></a>

SSL 인증서 인증은 상호 TLS(mTLS)를 사용하여 X.509 인증서를 사용하여 클라이언트를 인증합니다. [AWS RabbitMQ용 Amazon MQ mTLS 통합을 위한 CDK 스택을](https://github.com/aws-samples/amazon-mq-samples/blob/main/rabbitmq-samples/rabbitmq-mtls-sample/) 배포하여이 자습서에 필요한 AWS 리소스를 설정할 수 있습니다.

이 CDK 스택은 인증 기관, 클라이언트 인증서 및 IAM 역할을 포함하여 필요한 모든 AWS 리소스를 자동으로 생성합니다. 스택에서 생성한 리소스의 전체 목록은 패키지 README를 참조하세요.

**참고**  
CDK 스택을 배포하기 전에 `RABBITMQ_TEST_USER_NAME` 환경 변수를 설정합니다. 이 값은 클라이언트 인증서의 일반 이름(CN)으로 사용되며 자습서 단계에서 사용하는 사용자 이름과 일치해야 합니다. 예: `export RABBITMQ_TEST_USER_NAME="myuser"`

CDK 스택을 사용하는 대신 리소스를 수동으로 설정하는 경우 RabbitMQ용 Amazon MQ 브로커에서 SSL 인증서 인증을 구성하기 전에 동등한 인프라가 있는지 확인합니다.

### Amazon MQ를 설정하기 위한 사전 조건
<a name="rabbitmq-ssl-tutorial-prerequisite-cli"></a>

AWS CLI 버전 >= 2.28.23: 브로커 생성 중에 사용자 이름과 암호를 선택적으로 추가할 수 있습니다.

## AWS CLI를 사용하여 RabbitMQ에서 SSL 인증서 인증 구성
<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 명령을 `RUNNING`사용하여 브로커의 상태가 `CREATION_IN_PROGRESS`에서 로 전환되는지 확인합니다. 이 명령에서 이전 단계의 결과에서 얻은 브로커 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 스크립트를 사용하여 RabbitMQ용 Amazon MQ 브로커에 대한 연결을 테스트합니다. 이 스크립트는 클라이언트 인증서를 인증에 사용하고 연결이 제대로 구성되었는지 확인합니다. 성공적으로 구성되면 브로커가 메시지를 게시하고 소비하는 것을 볼 수 있습니다.

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