Android

[Android] https 요청 시 ssl 인증서 오류

박진만 2023. 3. 28. 17:51
반응형

http 요청은 잘 되는데 https 요청 시 아래 오류 발생

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException:Trust anchor for certification path not found


원인 : Connection 하는 웹사이트의 Certificate 인증서가 안드로이드 단말에 존재하지 않을 경우 발생

해결방법

1. 요청하고자 하는 웹사이트의 인증서 확인 후 다운로드
 - 브라우저 주소창에 자물쇠 클릭


 - 인증서 정보 클릭


 - 세부정보 탭 선택 후 내보내기 버튼 클릭


2. 프로젝트에 인증서 복사
 - res > raw 위치에 인증서 붙여넣기


3. Connection 시 인증서 정보 setting

CertificateFactory cf = CertificateFactory.getInstance("X.509");

InputStream caInput = getResources().openRawResource(R.raw.maandoo);
Certificate ca = cf.generateCertificate(caInput);

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null,null);
keyStore.setCertificateEntry("ca", ca);

// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), new java.security.SecureRandom());
caInput.close();

URL requestUrl = new URL(url + param);
HttpsURLConnection urlConnection = (HttpsURLConnection)requestUrl.openConnection();
urlConnection.setSSLSocketFactory(sslContext.getSocketFactory());
InputStream is = urlConnection.getInputStream();
반응형