총 게시물 38,530건, 최근 3 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

SSLContext, X509TrustManager

글쓴이 : 에찌 날짜 : 2017-05-19 (금) 17:08 조회 : 306
글주소 : http://www.androidside.com/B49/167312
 
  Comodo SSL 인증서
웹서버 SSL 인증서, 프로그램 인증 Active X 인증, 보안메일인증.
comodossl.co.kr
  SSL 써트샵
SSL 인증서, 네트워크 보안, 개인정보보호, 브랜드 이미지 강화, 역시 써트샵.
www.sslskorea.com/
  보안서버 SSL인증 블루웹
유럽 시장점유율 높은 뛰어난 호환성 Alpha SSL 55000원.
www.blueweb.co.kr/
신청하기


안드로이드, 자바 그리고 다양한 질문에 대해 성실히 답해드립니다. Q&A Jang

현재 아래와 같이 ssl이 적용된 서버에 데이터를 요청하고있습니다.

 @Override
protected String doInBackground(String... params) {

Logger.d("login check task");

try{
//Param length 확인한 후 Param 배열 추가해야함
param0 = (String)params[0];//type
param1 = (String)params[1];
param2 = (String)params[2];

link= AppConfig.WEB_LOGIN_CHECK;
data = URLEncoder.encode("mb_id", "UTF-8") + "=" + URLEncoder.encode(param1, "UTF-8");
data += "&" + URLEncoder.encode("mb_password", "UTF-8") + "=" + URLEncoder.encode(param2, "UTF-8");

URL url = new URL(link);

trustAllHosts();

HttpsURLConnection httpsURLConnection = (HttpsURLConnection)url.openConnection();
// URLConnection conn = url.openConnection();

httpsURLConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});

HttpURLConnection conn = httpsURLConnection;
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

wr.write( data );
wr.flush();
wr.close();

BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

StringBuilder sb = new StringBuilder();
String line = null;

// Read Server Response
while((line = reader.readLine()) != null)
{
sb.append(line);
break;
}
return sb.toString();
}
catch(Exception e){
e.printStackTrace();
return new String("Exception: " + e.getMessage());
}

}
}
private static void trustAllHosts() {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}

@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
// TODO Auto-generated method stub

}

@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
// TODO Auto-generated method stub
}
}};

// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
그런데 구글측에서 

SSL 인증서 확인을 올바르게 처리하려면 맞춤 X509TrustManager 인터페이스의 checkServerTrusted 방식에서 코드를 변경하여 서버에서 제공하는 인증서에서 개선이 필요한 부분을 발견할 때마다 CertificateException이나 IllegalArgumentException을 제기합니다.

이 문제를 해결하는 방법은 다음과 같습니다.

  1. 코드를 적절하게 변경합니다.
  2. Play Console에 로그인하고 업데이트된 버전의 앱을 제출합니다. 이때 APK의 버전 번호를 높이세요.

내용과 같이 앱을 구글플레이에 올릴 수가 없다고 하였습니다.

X509TrustManager의 보안이슈로 인하여 문제가 발생할 수도 있으니 해당 부분을 수정해서 apk를 다시 올리라는 것이었습니다.

====================================================================

위 부분이 현재까지 제게 일어난 일이고 제가 궁금한 것은
어떻게 SSL이 적용된 서버에서 데이터를 받을 수 있을 까 라는 것입니다.

구글링을 해보니 https 통신을 할 때는 SSLSocketFactory 또는 SSLContext를 사용해야한다고하던데..
현재는 SSLContext를 적용하지않은 않은채로 httpsURLConnection 으로만으로도 데이터가 받아지기는 합니다.
굳이 SSLContext를 사용해야하나요?
그리고 SSLContext를 사용하는 이유는 무엇인가요..?
그리고 현재 제가 요청하는 URL은 정식인증서인데 X509TrustManager와 SSLContext를 사용해야하나요?
아직 https 통신에 대해서 이해를 잘 못해서.. 많은 도움 바랍니다 ㅠ



질문자가 자신의 포인트 25 점을 걸었습니다.
답변하시면 포인트 2을, 답변이 채택되면 포인트 20을 드립니다.

질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

안사드 2017-05-19 (금) 18:11
HTTPsURLCONNECTION사용하세요.
댓글주소 추천 0 반대 0
     
     
에찌 2017-05-19 (금) 18:13
[@안사드] HttpsURLConnection 내부 로직에 X509Certificate 와 SSLSocketFactory 를 사용하고있네요
아마 위에 있는 부분은 커스텀으로 사용하기 위해 사용하는 듯합니다.
감사합니다 ㅎ ^^
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기