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();
반응형