ssl 인증서 pem 파일 만들기 java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
안드로이드 에뮬레이터에서 API 호출 시
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
에러가 났는데 해당 도메인은 신뢰할 수 없는 인증서라 그렇다고 한다.
해결방법으로는
1. 소스에서 API 호출하는 웹 서버의 CA 를 강제로 하드코딩해서 신뢰 시켜버리기
2. API 호출 웹 서버의 설정을 변경하기
가 있는데 웹 서버를 내가 만들었기 때문에 2번으로 진행한다.
안드로이드 에뮬레이터가 아닌 실제 디바이스에서는 API 호출 해서 잘 받아오는데
(안드로이드 에뮬이 아닌 실제 사용중인 모바일 디바이스에선 왜 잘 받아오냐 =>
아마 이런걸 체인 에러(최신 디바이스 에서는 최신 루트, 최신 인증서를 보유하고 있는데
일부 구형에서는 보유를 안하고 있어서 인식을 못하는 듯) 라고 하나보다)
API 서버는 정상적으로 SSL 이 적용 중이라고 나온다.
openssl 의 s_client 로 현재 운영중인 웹 서버의 SSL 정보를 봤다.
1. 네이버
>openssl s_client -connect naver.com:443 | openssl x509 -noout -subject -issuer
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify error:num=19:self signed certificate in certificate chain
subject= /C=KR/ST=Gyeonggi-do/L=Seongnam-si/O=NAVER Corp./CN=*.www.naver.com
issuer= /C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
2. 내 서버
>openssl s_client -connect www.maani.com:443 | openssl x509 -noout -subject -issuer
depth=0 CN = www.maani.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = www.maani.com
verify error:num=21:unable to verify the first certificate
verify return:1
subject= /CN=www.maani.com
issuer= /C=GB/ST=Greater Manchester/L=Salford/O=Sectigo Limited/CN=Sectigo RSA Domain Validation Secure Server CA
unable to get local issuer certificate
unable to verify the first certificate
다른 정상적인 사이트와 달리 속을 들여다보면 이런 에러들이 들어가있다.
웹 서버의 설정을 바꿔야 한다. nginx 를 사용중이고
SSL 구매 할 때 이렇게 3개 파일이 들어 있어서
nginx.conf 에 SSL 부분에
이렇게 설정 했었다.
저 파일들을
도메인 인증서 -> 체인 인증서 -> 루트 인증서 순으로 하나의 파일로 만들어야 한다.
www.maani.com.key -> www.maani.com.crt -> Chain_RootCA_Bundle.crt
이렇게 순서대로 이어 붙였으면 pem 확장자로 저장한 다음에
www.maani.com.pem 뭐 이렇게..
nginx SSL config 도 방금 만든 pem 으로 셋 다 넣으면 된다.