본문 바로가기

블로그

LG CNS 기술블로그 DX Lounge에서 최신 IT 소식을 만나보세요!

AWS Ambassador

AWS IoT Core Endpoint 신뢰하지 않는 인증서 오류 트러블슈팅

2023.02.01

1. 개요

AWS IoT Core를 사용하여 프로젝트를 진행할 시 SDK를 사용하여 백엔드를 개발하는 경우가 있습니다.
이번 포스트는 Backend에서 IoT Core를 사용하는 어플리케이션을 개발할 시에 겪은 ‘신뢰하지 않는 인증서 오류’를 해결한 케이스에 대해 다뤄보려고 합니다.

2. 트러블슈팅

2.1 배경 (아키텍처 다이어그램)

2.2 발단

개발 환경은 Spring boot로 개발된 Backend Pod가 EKS on EC2로 기동 중이었으며, Backend에서 IoT Core를 통해 IoT Device에 Rule을 내리는 기능이 개발 중이었습니다.

이때 다음과 같은 에러가 발생합니다.

위의 에러는 Backend에서 IoT Core로 API 통신을 위해 Endpoint로 연결을 시도 중, SSL: CERTIFAICATE VERIFY FAILED 가 발생한 것입니다.

2.3 전개

해당 엔드포인드에 접근해 보니 다음 그림과 같이 신뢰하지 않는 인증서였습니다.
• 엔드포인트 접속 시, 웹 브라우저 화면

• 인증서 정보

확인해 보니 구글 크롬, 사파리 등에서 더 이상 Symantec에서 발급한 인증서를 신뢰하지 않고 있었습니다.
(관련링크1 : https://kicassl.com/cstmrsuprt/ntc/searchNtcDetail.sg?ntcSeq=156, 관련링크2 : https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html)

2.4 위기

이에 해당 인증서를 별도로 받아 keystore를 통해 신뢰하는 인증서에 추가해 보았으나,여전히 인증서 오류가 발생하였습니다.

2.5 절정

여러 테스트 및 웹 서핑을 통해 원인을 찾아낼 수 있었습니다.

keystore로 인증서를 추가하더라도 2019년 4월 JDK(버전 12, 11, 8 및 7) 패치 이후로 Symantec 인증서를 신뢰하지 않도록 변경 되었던 것이었습니다. (관련링크 : https://blogs.oracle.com/java/post/oracles-plan-for-distrusting-symantec-tls-certificates-in-the-jdk)

이를 Hedge 할 방법으론, java.secure 파일에서 ‘jdk.security.caDistrustPolicies=SYMANTEC_TLS’ 옵션을 제거(주석) 하는 것입니다.

2.6 결말

하지만 위의 방법은 굳이 보안에 문제가 있어서 막은 것을 풀고 쓴다는 것이 찝찝했습니다.
그리곤 AWS는 Symantec 인증서 비신뢰 이슈가 발생하고 있는데 아무 조치도 하지 않고 있었을까? 하는 의문이 들었고, 역시 다른 경로(엔드포인트)가 존재했습니다.
AWS IoT Core의 서비스 엔드포인트는 원래 https://{account-specific-prefix}.iot.{region}.amazonaws.com 으로 Symantec 인증서를 사용하였으나,
위와 같이 많은 기업에서 신뢰하지 않게 되면서 새로운 서비스 엔드포인트 https://{account-specific-prefix}-ats.iot.{region}.amazonaws.com 을 생성하였고 이쪽을 사용하도록 권고하고 있었습니다.

하지만 AWS CLI 명령어와 SDK의 Default는 여전히 Symantec 인증서가 사용되는 엔드포인트여서 발생한 문제였습니다.
이에 Backend에서 사용하는 IoT Core 엔드포인트를 ATS로 변경하였고 모든 문제를 해결할 수 있었습니다.

• 애플리케이션 성공 메시지

• AWS CLI 참고

3. 마무리

이번 트러블 슈팅을 요약하면 다음과 같습니다.
(1) AWS IoT Core는 원래 Symantec에서 발급된 인증서를 사용하는 서비스 엔드포인트를 사용하고 있었다.
(2) Symantec의 보안 사고로 여러 기업들은 더 이상 Symantec 발급 인증서를 신뢰하지 않기로 하였다.
(3) 이에 AWS는 ATS에서 발급한 인증서를 제공하는 또 다른 서비스 엔드포인트를 사용하도록 권고 중이다.
(4) 기존 디바이스와의 호환성을 유지하기 위해 default 설정을 Symantec 엔드포인트를 사용하도록 유지했으며, 이에 서비스 엔드포인트는 별도의 설정을 통해 연결을 하여야 한다.
a. ATS 엔드포인트 사용
b. 엔드포인트 생성 후, -ats postfix 추가하여 사용
c. java.secure 옵션 변경 (비추천)

AWS IoT Core 개발을 하는 Backend 개발자분들에게 도움이 되길 바라며 포스팅을 마치겠습니다.

챗봇과 대화를 할 수 있어요