콘텐츠로 이동
무료 평가 시작

TLS 문제

TLS 오류는 MQTT CONNECT를 보내기 전 핸드셰이크에서 납니다. 클라이언트 쪽 문장은 짧으므로 브로커 로그의 OpenSSL 문장을 함께 봅니다. 예시는 TLS 브로커에 연결의 파일 이름을 씁니다.

PDComm 시뮬레이터는 평문 TCP로 브로커에 연결합니다. TLS 리스너에 연결하면 다음 오류가 납니다.

위치 문장
시뮬레이터 MQTT broker connection failed: MQTT transport I/O: ConnectionReset
브로커 로그 OpenSSL Error while trying to get the error[0]: error:0A00010B:SSL routines::wrong version number

시뮬레이터는 평문 리스너에 연결하고, TLS 구간은 브로커 브리지가 맡게 합니다.

클라이언트 출력 브로커 로그 원인 해결
Error: Protocol error tlsv1 alert unknown ca 클라이언트가 브로커 인증서를 발급한 CA를 신뢰하지 않습니다. 8883번 포트에 --cafile 없이 연결하면 운영체제 기본 신뢰 저장소를 쓰므로 자체 CA를 모릅니다. --cafile ca.crt로 브로커 인증서를 발급한 CA를 줍니다.
Error: Protocol error tls alert bad certificate 브로커 인증서의 subjectAltName에 연결한 호스트 이름이나 IP 주소가 없습니다. 인증서를 그 이름과 주소로 다시 발급하거나, 인증서에 있는 이름으로 연결합니다.
Error: The connection was lost peer did not return a certificate 브로커가 클라이언트 인증서를 요구하는데(require_certificate true) 클라이언트가 내지 않았습니다. --cert와 --key를 줍니다.

mosquitto_sub -d로 실행하면 클라이언트 쪽 OpenSSL 문장도 보입니다. CA를 신뢰하지 않거나 이름이 맞지 않으면 다음 줄이 나옵니다.

OpenSSL Error while trying to get the error[0]: error:0A000086:SSL routines::certificate verify failed

edge 브로커의 브리지가 site에 연결하지 못하면 edge 로그에 다음이 반복됩니다. 대기 시간은 매번 달라집니다.

OpenSSL Error while trying to get the error[0]: error:0A000086:SSL routines::certificate verify failed
Client local.pdcomm-edge-bridge [(null):0] disconnected: bad socket read/write: A TLS error occurred
Bridge site next backoff will be 5193 ms
확인할 것 설정
site 인증서를 발급한 CA bridge_cafile
site 인증서의 subjectAltName에 있는 주소 address
site가 신뢰하는 CA가 발급한 브리지 인증서 bridge_certfile, bridge_keyfile

disconnected: 뒤의 이유는 Protocol error.로 나오기도 합니다. 핵심은 앞줄의 certificate verify failed입니다.

브리지가 연결되면 site 로그에 as pdcomm-edge-bridge (p5, c0, k60, u'pdcomm-edge')처럼 브리지의 연결이 보입니다.

MQTT 도구 대신 openssl s_client로 TLS만 따로 시험하면 검증 실패 이유가 숫자로 나옵니다.

터미널 창
openssl s_client -connect 127.0.0.1:8883 -CAfile ca.crt -cert operator.crt -key operator.key \
-verify_ip 127.0.0.1 -verify_return_error -brief < /dev/null
출력 뜻
CONNECTION ESTABLISHED, Protocol version: TLSv1.3 TLS 구성은 정상입니다. 문제는 MQTT 인증이나 권한에 있습니다.
verify error:num=19:self-signed certificate in certificate chain -CAfile의 CA가 브로커 인증서를 발급한 CA가 아닙니다.
verify error:num=64:IP address mismatch 인증서의 subjectAltName에 그 IP 주소가 없습니다. 호스트 이름이면 -verify_hostname을 씁니다.

인증서 내용은 openssl x509로 확인합니다.

터미널 창
openssl x509 -in site.crt -noout -ext subjectAltName
openssl x509 -in site.crt -noout -enddate
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:127.0.0.1
notAfter=Oct 14 17:14:30 2027 GMT

notAfter가 지난 인증서는 검증에 실패합니다. 만료 전에 새 인증서로 바꾸고 브로커를 다시 시작합니다.