임베디드 관련 카테고리/프로토콜

MQTT TLS/SSL 인증 및 설정 가이드

CBJH 2024. 12. 12.
728x90
반응형

MQTT 브로커를 사용하면서 TLS/SSL 인증을 설정하고, TX2에서 보안 연결을 성공시키는 과정을 정리하였습니다. OpenSSL을 활용해 키와 인증서를 생성하고, Mosquitto 브로커 설정을 완료한 뒤 TLS/SSL 통신을 성공적으로 테스트하는 방법과 주요 설정 사항을 다룹니다.

  • TX2는 Nvidia board입니다. 라즈베리파이나 개인 PC에서 테스트해도 똑같은 결과가 나옵니다.
  • 브로커 서버는 NCP 서버나 AWS EC2서버로 테스트해주세요.

1. 인증서 생성

1.1 CA 인증서 생성

CA 인증서를 생성하여 서버와 클라이언트 키를 발급합니다.

openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -keyout ca.key -out ca.crt -subj "/C=KR/ST=N/S/L=Daegu/O=MyCompany/OU=MQTT_CA_KEY/CN=my_ca"
  • 옵션 설명:
    • -subj: 인증서 정보를 명령어로 입력.

1.2 서버 인증서 생성

  1. 서버 키와 CSR 생성:
openssl genrsa -out server.key 2048
openssl req -new -keyout server.key -out server.csr -subj "/C=KR/ST=N\/S/L=Seoul/O=MyCompany/OU=MQTT_SERVER_KEY/CN=broker.example.com"
  • CN값은 server.key와 server.crt가 위치할 브로커 서버의 공인 IP주소나 DNS로 변환한 도메인 주소를 입력합니다. 이 부분을 제대로 입력하지 않으면 오류가 발생해 TLS 키를 이용한 open ssl, mqtt 연결이 되지 않습니다.
  • 공인 IP의 경우 서버를 재실행하거나 여러가지 문제로 바뀔 수 있으므로 DNS를 활용해 도메인 주소를 받게되면 IP가 바뀌더라도 DNS 주소가 알아서 추적해 바뀐 공인 IP를 연결해주므로 mqtt 서버를 오랫동안 유지할 경우엔 도메인 주소를 사용하는 것이 바람직합니다. 

 

  1. 서버 인증서 발급:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256

1.3 클라이언트 인증서 생성

  1. 클라이언트 키와 CSR 생성:
openssl genrsa -out client.key 2048
openssl req -new -keyout client.key -out client.csr -subj "/C=KR/ST=N\/S/L=Seoul/O=MyCompany/OU=MQTT_CLIENT_KEY/CN=TX2"
  1. 클라이언트 인증서 발급:
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256

2. Mosquitto 브로커 설정

2.1 mosquitto.conf 파일 수정

TLS/SSL 인증서를 Mosquitto 브로커에서 사용하도록 설정합니다.

설정 파일 위치: /etc/mosquitto/mosquitto.conf

listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate true
allow_anonymous false
password_file /etc/mosquitto/passwordfile
acl_file /etc/mosquitto/acl
  • require_certificate true: 클라이언트 인증서를 요구.
  • allow_anonymous false: 익명 접근 차단.
  • password_file: 사용자 인증 파일 설정.
  • acl_file: 토픽 접근 권한 관리.

2.2 ACL 파일 설정

ACL 파일 위치: /etc/mosquitto/acl

user mosquitto_user
topic readwrite #
  • user: 사용자 이름 지정.
  • topic readwrite #: 모든 토픽에 대해 읽기/쓰기 허용.

2.3 비밀번호 파일 생성

Mosquitto 사용자 인증을 위한 비밀번호 파일을 생성합니다.

sudo mosquitto_passwd -c /etc/mosquitto/passwordfile mosquitto_user
  • 브로커 서버에서 명령어 입력 후 비밀번호를 설정해줍니다.

3. TLS/SSL 연결 테스트

3.1 OpenSSL로 연결 시도

TX2에서 OpenSSL을 사용해 브로커 서버에 연결합니다.

openssl s_client -connect broker.example.com:8883 \
    -CAfile /home/tx2/mqtt/ca.crt \
    -cert /home/tx2/mqtt/client.crt \
    -key /home/tx2/mqtt/client.key

3.2 Mosquitto_pub로 메시지 퍼블리시

TX2에서 메시지를 퍼블리시합니다.

mosquitto_pub -h broker.example.com -p 8883 \
    --cafile /home/tx2/mqtt/ca.crt \
    --cert /home/tx2/mqtt/client.crt \
    --key /home/tx2/mqtt/client.key \
    --username mosquitto_user --pw mypassword \
    -t secure/topic -m "Test message from TX2"
  • mypassword에 아까 브로커 서버에서 설정한 비밀번호를 대신 입력해줍니다.

3.3 Mosquitto_sub로 메시지 구독

브로커 서버에서 메시지를 구독하여 확인합니다.

mosquitto_sub -h broker.example.com -p 8883 \
    --cafile /etc/mosquitto/certs/ca.crt \
    --cert /etc/mosquitto/certs/server.crt \
    --key /etc/mosquitto/certs/server.key \
    --username mosquitto_user --pw mypassword \
    -t secure/topic
  • mypassword에 아까 브로커 서버에서 설정한 비밀번호를 대신 입력해줍니다.

4. ACL 및 비밀번호 설정의 효과

4.1 ACL 설정의 효과

ACL 파일을 추가하여 사용자별 토픽 접근 권한을 부여했습니다.

  • ACL 파일이 없으면 클라이언트가 연결되더라도 퍼블리시/구독 권한이 거됩니다.
  • 설정 추가:
  • user mosquitto_user topic readwrite #

4.2 비밀번호 설정이 필요한 이유

allow_anonymous false 설정 시 사용자 인증이 필수입니다.

  • 비밀번호 파일이 없으면 클라이언트 인증이 실패하여 MQTT 연결이 불가능합니다.
  • 비밀번호 파일을 추가하여 TLS/SSL 보안과 사용자 인증을 동시에 적용합니다.

5. 결론

TLS/SSL 인증 및 Mosquitto 브로커 설정을 통해 안전한 MQTT 통신 환경을 구축할 수 있었습니다. ACL과 비밀번호 파일 설정은 필수적인 보안 요소이며, 이를 통해 인증된 사용자만 안전하게 토픽을 퍼블리시하거나 구독할 수 있습니다.

문제가 발생하거나 추가적인 설정 방법이 궁금하다면 댓글로 문의해주세요!

댓글