MQTT · 2026-04-28

MQTT와 TLS 상호 인증 구성 방법

MQTT와 TLS 기반 상호 인증의 개념, 인증서 생성, 브로커·클라이언트 설정 및 테스트 절차를 예제로 설명한 실무 중심 기술문서

작성일 : 2026-04-28 ㆍ 작성자 : 관리자
post
목차

개요

이 문서에서는 MQTT에서 TLS 기반 상호 인증(mutual TLS)을 구현하는 전체 흐름을 다룬다. 상호 인증은 브로커와 클라이언트가 서로의 인증서를 확인해 보다 강력한 인증과 암호화를 제공한다. 초보자도 따라올 수 있도록 인증서 생성, 브로커 설정, 클라이언트 설정, 테스트 방법을 단계별로 설명한다.

상호 인증 개념

TLS 상호 인증에서는 브로커(서버)와 클라이언트가 서로의 공개키 기반 인증서를 검증한다. 일반 TLS와 달리 클라이언트도 인증서를 제시하므로 비밀번호 기반 인증보다 안전하다. 일반 흐름은 다음과 같다.

  • CA(Certificate Authority) 생성 또는 신뢰할 수 있는 CA 사용
  • 브로커와 클라이언트 각각의 키와 CSR 생성
  • CA로부터 인증서 발급 및 유효성 검증
  • 브로커와 클라이언트에 인증서 및 키 설치
  • TLS 연결 시 양측 인증서 검증

준비물

  • OpenSSL 설치 환경
  • Mosquitto 또는 다른 MQTT 브로커
  • mosquitto_pub / mosquitto_sub 또는 MQTT 클라이언트 라이브러리

인증서 생성 절차

1) 자체 CA 생성

테스트용으로 자체 CA를 만든다.

openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=MyMQTT-CA"

2) 브로커 키와 CSR 생성

openssl genrsa -out broker.key 2048
openssl req -new -key broker.key -out broker.csr -subj "/CN=mqtt-broker.local"
openssl x509 -req -in broker.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out broker.crt -days 365 -sha256

3) 클라이언트 키와 인증서 생성

openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/CN=mqtt-client-01"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256

이제 ca.crt, broker.crt, broker.key, client.crt, client.key 파일이 준비된다.

브로커 설정 (Mosquitto 예시)

mosquitto의 TLS 및 클라이언트 인증 관련 설정 예시이다. broker.conf에 다음을 추가하거나 별도 파일로 관리한다.

listener 8883
cafile /path/to/ca.crt
certfile /path/to/broker.crt
keyfile /path/to/broker.key
require_certificate true
use_identity_as_username true
# optionally configure TLS versions and ciphers
tls_version tlsv1.2

require_certificate true로 설정하면 클라이언트 인증서를 요구하고, CA로 서명된 인증서만 허용한다. use_identity_as_username를 사용하면 클라이언트 인증서의 CN을 사용자 식별자로 사용할 수 있다.

클라이언트 설정

mosquitto_pub/sub 사용 시 인증서 관련 옵션을 지정한다.

mosquitto_sub -h mqtt-broker.local -p 8883 --cafile /path/to/ca.crt --cert /path/to/client.crt --key /path/to/client.key -t "test/topic"
mosquitto_pub -h mqtt-broker.local -p 8883 --cafile /path/to/ca.crt --cert /path/to/client.crt --key /path/to/client.key -t "test/topic" -m "hello"

라이브러리(Paho, MQTT.js 등)를 사용할 때는 클라이언트 인증서와 키를 TLS 옵션으로 전달하면 된다. 이 과정이 바로 mqtt client certificate 인증의 핵심이다.

연결 테스트와 문제 해결

1) 기본 연결 확인

브로커 로그와 클라이언트 명령의 출력으로 연결 여부를 확인한다. 인증서 오류가 발생하면 브로커 로그에 상세 원인이 나타난다.

2) 자주 발생하는 오류

  • CA 미설정: 클라이언트가 사용하는 CA와 브로커의 cafile 불일치
  • CN 불일치: 호스트 이름 검증이 활성화된 경우 브로커 인증서의 CN이 클라이언트가 접속하는 호스트와 달라 실패
  • 키·인증서 권한 문제: 파일 권한으로 인해 브로커가 key 파일을 읽지 못하는 경우

3) openssl로 상세 확인

openssl s_client -connect mqtt-broker.local:8883 -CAfile ca.crt -cert client.crt -key client.key

이 명령은 TLS 핸드쉐이크와 인증서 체인을 출력해 문제 원인 파악에 유용하다.

보안 고려사항

  • 인증서 유효기간과 갱신 정책 수립
  • 개인키 보호를 위한 파일 권한 및 HSM 사용 검토
  • TLS 버전과 강력한 암호화 스위트 적용
  • 클라이언트 식별과 권한 관리를 별도로 설계

실무 적용 팁

  • 테스트 환경에서는 자체 CA를 사용하되, 운영 환경은 공인 또는 내부 기업 CA 사용
  • 인증서 기반 식별을 사용자 아이디와 매핑해 권한 제어에 활용
  • 자동화된 인증서 프로비저닝(예: ACME, 내부 PKI 스크립트) 고려

맺음말

본 문서는 mqtt mutual tls 설정, mqtt client certificate 인증, 상호 인증 mqtt 구성의 기본 절차를 포함한다. 인증서 생성부터 브로커·클라이언트 설정, 테스트와 문제 해결까지 실무에서 바로 적용 가능한 흐름을 제시했다. 운영 환경에서는 인증서 관리와 키 보호에 특히 주의한다.

mqtt mutual tls 설정 mqtt client certificate 인증 상호 인증 mqtt 구성 mqtt tls mosquitto tls 설정 mutual tls mqtt 보안 클라이언트 인증서