Mosquitto TLS 설정으로 MQTT 통신 암호화
Mosquitto에서 TLS를 적용해 MQTT 통신을 암호화하는 절차와 인증서 생성, 서버·클라이언트 설정 및 예제를 초보자도 이해하기 쉬운 자료
목차
개요
MQTT는 경량 메시지 프로토콜이다. 기본적으로 평문으로 통신하므로 네트워크 상에서 도청 위험이 있다. TLS를 적용하면 전송 중 데이터를 암호화할 수 있다. 이 글은 mosquitto tls 설정 절차와 openssl을 이용한 인증서 생성, mosquitto.conf 설정, 클라이언트 연결 예제를 단계별로 설명한다.
TLS 개념 간단 정리
TLS는 서버와 클라이언트 간의 통신을 암호화하고 무결성과 인증을 제공한다. 기본 요소는 CA(인증기관), 서버 인증서, 서버 개인키, 클라이언트 인증서(선택)다. Mosquitto에서 TLS를 적용하면 mqtt tls 설정 방법에 따라 브로커가 클라이언트와 암호화된 연결을 수립한다.
사전 준비
- OpenSSL 설치
- Mosquitto 설치(mosquitto, mosquitto-clients)
- 기본 포트: TLS는 보통 8883 사용
인증서 생성 단계
자체 서명 CA를 만들고 서버 인증서를 발급하는 일반적인 절차다. 아래 예제는 테스트 환경용이다. 운영 환경에서는 공인 CA나 내부 PKI 사용을 권장한다.
1) CA 키와 루트 인증서 생성
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=MyMQTT-CA"
2) 서버 키와 CSR 생성
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/CN=mqtt.example.com"
3) 서버 인증서 서명
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256
필요하면 SAN(Subject Alternative Name)을 포함해서 발급해야 브라우저나 클라이언트가 호스트명을 검증할 때 문제를 줄일 수 있다.
Mosquitto 서버 설정
생성한 인증서를 mosquitto가 읽을 수 있는 경로에 두고 설정 파일을 수정한다. 기본 설정 파일 위치는 /etc/mosquitto/mosquitto.conf 이다.
예시 mosquitto.conf
# TLS listener
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
# 클라이언트 인증서 필수 여부 (optional)
# require_certificate true
# tls_version tlsv1.2
설정 후 mosquitto 서비스를 재시작한다. 예: systemctl restart mosquitto
클라이언트 연결 예제
mosquitto_pub, mosquitto_sub를 이용해 TLS로 연결한다. 클라이언트는 CA 인증서를 신뢰해야 한다.
CA로 서버 인증서 검증하는 예
mosquitto_sub -h mqtt.example.com -p 8883 --cafile ca.crt -t test/topic -v
mosquitto_pub -h mqtt.example.com -p 8883 --cafile ca.crt -t test/topic -m "hello"
클라이언트 인증서(상호 인증)가 필요한 경우
mosquitto_pub -h mqtt.example.com -p 8883 --cafile ca.crt --cert client.crt --key client.key -t test/secure -m "secure"
클라이언트 인증서를 사용하면 브로커에서 추가적인 인증과 권한 관리를 적용할 수 있다. 상호 인증은 보안 수준을 크게 높인다.
검증 및 문제 해결
- 포트가 열려 있는지 확인: ss나 netstat로 8883 리스닝 확인
- 로그 확인: /var/log/mosquitto/mosquitto.log 에 오류 메시지 기록
- 인증서 경로와 권한 확인: mosquitto 프로세스가 파일을 읽을 수 있어야 함
- 호스트명 검증 실패 시 SAN 문제일 가능성 있음. CN 대신 SAN에 호스트명을 넣어 재발급
보안 권장 사항
- TLS 1.2 이상 사용
- 약한 암호화 스위트 비활성화
- 운영 환경에서는 공개 CA 또는 관리되는 내부 PKI 사용
- 클라이언트 인증서를 도입해 장치 식별 강화
- 인증서 만료 주기 관리 및 자동 갱신 고려
요약
Mosquitto TLS 설정은 MQTT 통신 암호화의 핵심이다. openssl로 CA와 인증서를 생성한 뒤 mosquitto.conf에 cafile, certfile, keyfile을 지정하면 기본 구성이 완료된다. 클라이언트는 --cafile 옵션으로 서버 인증서를 검증하고 필요 시 클라이언트 인증서로 상호 인증을 수행한다. 위 절차와 예제를 따라하면 mqtt tls 설정 방법과 mqtt ssl mosquitto 예제에 대한 이해가 빠르게 정리된다.