최근 외부연동, 즉 마케팅 서비스들 위주의 관련 업무를 맡게되는 경우가 많았는데
그중의 가장 큰 골칫덩이는 메타다.
여기는 외국회사라 문의도 보내놓으면 n시간 뒤에나 답장이 오니,,
뭔가 필요한게 있으면 와다다 다 정리해서 컴팩트하게 문의를 해야
나중에 아차! 이것도 물어볼걸!! 하고 후회하지 않을 수 있다
혹시 그 메타에서 제공하던 페이스북 로그인 기능을 알고있는가?
최근에는 듣기로는? 공식적으로 페이스북 로그인에 대한 지원이 끊겼다고 들은 것 같다.
하지만 우리 솔루션을 쓰는 사람들은 페이스북 로그인을 이용해서 이용하는 사람들 또한 고객이기 때문에
해당 기능을 마음대로 fade out 시킬 수 는 없었다
근데 어느순간부터 특정 솔루션을 쓰고 있는 업체들에게서 페이스북 로그인 기능 사용시
`SSL certificate problem: unable to get local issuer certificate (Error code: 60)` 라는 메시지가 출력되는걸 확인했다.
근데? 다른 버전을 쓰고 있는 솔루션은 해당 오류가 발생하지 않았다.
https://developers.facebook.com/community/threads/1067949248803199/
SSL certificate problem: unable to get local issuer certificate (Error code: 60) - 개발자 커뮤니티 포럼 - Meta for Deve
The proposed solution may work temporarily, but it should not rely on modifying the vendor directory. Ideally, Facebook should update the library officially with the new certificates. Applying a manual patch in the vendor is not always feasible, especially
developers.facebook.com
찾아보니 이미 좀 알려진 이슈인듯 했다.
📌 정리
해당 이슈를 정리해보면, 해결 방법은 본문에 있으나
나는 왜 솔루션별로 이슈유무가 다르지..?에 대해 궁금해서 정리해봄.
결론적으로는 OpenSSL 버전 차이로 인해 증상이 다르게 나타난 케이스였음.
1️⃣ 원인
Facebook Graph SDK 내부에서 cURL 요청 시 아래와 같이 특정 CA 인증서 파일을 강제로 지정하고 있었음.
해당 DigiCertHighAssuranceEVRootCA.pem 인증서는 이미 못쓰는 루트 인증서임.
OpenSSL 1.0.x 환경에서는 해당 파일만을 기준으로 인증서를 검증하다 보니
unable to get local issuer certificate 오류가 발생한것으로 보임.
2️⃣ 해결 방법
CURLOPT_CAINFO 설정을 제거(주석 처리)하면,
- libcurl이 시스템에 설치된 기본 CA trust store를 사용하게 되고
- 최신 인증서 체인을 기준으로 정상적인 SSL 검증이 이루어짐.
즉, 인증을 비활성화하는 것이 아니라
더 최신이고 신뢰 가능한 인증서 묶음을 사용하도록 변경됨!
그래서 결론적으로는 주석처리하면 해당 이슈는 해결됨.
3️⃣ 그런데 왜 다른 솔루션은 문제 없었을까?
솔루션별 OpenSSL 버전 차이 때문이었음 , , ,,
- 문제가 발생한 솔루션: OpenSSL 1.0.x
- 정상 동작한 솔루션: OpenSSL 3.0.x
OpenSSL 1.1.0 이상부터는 Trusted First 옵션이 기본 활성화되면서,
- 서버가 제공한 인증서 체인이 일부 불완전하더라도
- 로컬 trust store에 있는 더 신뢰할 수 있는 중간/루트 인증서를 우선 사용하여
- 인증을 성공시키는 방식으로 동작됨
이로 인해 같은 코드라도 OpenSSL 3.x 환경에서는 정상 동작되는 거엿슴..
📎 참고:
https://docs.openssl.org/1.1.1/man1/verify/#options
주석처리는 결국 기존 라이브러리를 수정하라는 말과 같아서
라이브러리 수정하기 싫어요 흑흑..이라면 openssl 버전을 확인해보자
'트러블 슈팅 (+궁금증해결)🚀' 카테고리의 다른 글
| 계속 늘어나는 대규모 시스템을 어떻게 구축해 나아가야할까 (1) | 2024.06.02 |
|---|---|
| 트러블 슈팅이라기엔 애매하지만,, 라라벨에서 controller로 있던 파일들을 service패턴으로 ~ (0) | 2024.05.28 |
| 2억개의 상품을 데이터베이스에 어떻게 관리할 것인가? 에 관한 고찰 - 샤딩? nosql? rbdms? (0) | 2024.05.21 |
| HttpStatus cannot be resolved to a variable in 스프링부트 (0) | 2024.03.24 |
| flutter 안드로이드 웹뷰 디버깅 (0) | 2024.02.23 |