현재 적용된 TLS 설정은 전송 구간 암호화만 제공하며 클라이언트 인증은 수행하지 않음.
<aside>
require_certificate → 미설정 (클라이언트 인증서 검증 없음) allow_anonymous → true (ID/PW 검증 없음)
</aside>
즉 TLS 핸드셰이크만 통과하면 누구나 브로커에 접속할 수 있는 상태
-insecure 옵션은 서버 인증서의 호스트명 검증만 생략할 뿐, CA 신뢰 관계 검증은 여전히 수행한다. 즉 서버가 어떤 CA로 서명된 인증서를 사용하는지 확인하려 하기 때문에 CA 파일 없이는 TLS 핸드셰이크 자체가 실패한다.Python의 ssl.CERT_NONE 은 인증서 관련 모든 검증을 완전히 생략한다. CA 신뢰 여부, 호스트명 일치 여부를 전혀 확인하지 않아 TLS 핸드셰이크가 통과된다.
| 항목 | mosquitto_sub | Python paho-mqtt |
|---|---|---|
| 호스트명 검증 | --insecure로 생략 가능 | tls_insecure_set으로 생략 가능 |
| CA 신뢰 검증 | 생략 불가 | ssl.CERT_NONE으로 완전 생략 가능 |
| 결과 | 핸드셰이크 실패 | 핸드셰이크 성공 |
mosquitto_sub 는 보안 도구로서 최소한의 안전장치를 유지하도록 설계되어 있어 CA 검증을 완전히 우회할 수 없다. 반면 Python ssl.CERT_NONE 은 모든 검증을 코드 레벨에서 제거할 수 있어 공격 도구로 활용이 가능하다.
이는 역설적으로 클라이언트 인증(mTLS)의 필요성을 증명한다. CA 검증을 우회하더라도 브로커가 클라이언트 인증서를 요구하면 접속 자체가 불가능해지기 때문이다.
| 항목 (장점) | ID/PW (편의성) | mTLS (보안성) |
|---|---|---|
| 무단 접속 차단 | O | O |
| 무차별 대입 공격/추론 가능 여부 | 취약 (문자열 기반) | 매우 어려움 (인증서 기반) |
| 공격 시나리오 | ID/PW만 맞으면 외부에서 접속 가능 | 인증서 없이는 절대 접속 불가 |
| 클라이언트 물리 강탈 대응 | 계정 비활성화 | ACL에서 해당 기기 제거 |
[쳬택] mTLS + ACL