TLS 문제
TLS 오류는 MQTT CONNECT를 보내기 전 핸드셰이크에서 납니다. 클라이언트 쪽 문장은 짧으므로 브로커 로그의 OpenSSL 문장을 함께 봅니다. 예시는 TLS 브로커에 연결의 파일 이름을 씁니다.
시뮬레이터와 TLS
섹션 제목: “시뮬레이터와 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 failedClient local.pdcomm-edge-bridge [(null):0] disconnected: bad socket read/write: A TLS error occurredBridge 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')처럼 브리지의 연결이 보입니다.
openssl로 원인 좁히기
섹션 제목: “openssl로 원인 좁히기”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 subjectAltNameopenssl x509 -in site.crt -noout -enddateX509v3 Subject Alternative Name: DNS:localhost, IP Address:127.0.0.1notAfter=Oct 14 17:14:30 2027 GMTnotAfter가 지난 인증서는 검증에 실패합니다. 만료 전에 새 인증서로 바꾸고 브로커를 다시 시작합니다.