2013-06-06 2 views
1

HTTPS 연결을 사용하여 연결하려고하면 SSL 피어 확인되지 않은 예외가 발생합니다. 저는 HTTPS를 처음 사용합니다. 내 코드는 다음과 같습니다안드로이드에서 SSLPeerUnverifiedException 받기

HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; 

DefaultHttpClient client = new DefaultHttpClient(); 
SchemeRegistry registry = new SchemeRegistry(); 
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); 
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 
registry.register(new Scheme("https", socketFactory, 443)); 
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry); 
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());     HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 
HttpPost httppost = new HttpPost("https://server.example.com/Login"); 
List<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(
          2); 
        nameValuePairs.add(new BasicNameValuePair("LoginId",uname)); 
        nameValuePairs.add(new BasicNameValuePair("Password",pass)); 
try { 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpResponse response = httpClient.execute(httppost); 
if (response.getStatusLine().getStatusCode() == 200) { 

}    
Log.i("zacharia", "Response :"+EntityUtils.toString(response.getEntity())); 
} catch (Exception e) { 
} 

답변

1

서버가 보낸 인증서가 인증 된 CA에 의해 서명 자체 서명 된 인증서가 아닌 인증서 때 확인되지 않은 예외가 여러 가지 이유로 발생 될 수있는 SSL 피어가 가장 흔한 경우입니다

KeyStore selfsignedKeys = KeyStore.getInstance("BKS"); 
selfsignedKeys.load(context.getResources().openRawResource(R.raw.selfsignedcertsbks), 
"genericPassword".toCharArray()); 
TrustManagerFactory trustMgr = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
trustMgr.init(selfsignedKeys); 
SSLContext selfsignedSSLcontext = SSLContext.getInstance("TLS"); 
selfsignedSSLcontext.init(null, trustMgr.getTrustManagers(), new SecureRandom()); 
HttpsURLConnection.setDefaultSSLSocketFactory(selfsignedSSLcontext.getSocketFactory()); 
URL serverURL = new URL("https://server.example.com/endpointTest"); 
HttpsURLConnection serverConn = (HttpsURLConnection)serverURL.openConnection(); 

이 방법을 사용하면 인증서가에 의해 서명되지 확신하는 경우에만입니다 계수에 보자 그 안드로이드의 일반적인 방법은 다음과 같이 요청을 한 후 신뢰할 수있는 인증서 체인에 인증서를 추가하고하는 문제입니다 CA, 그리고 그것을 작동시키기 위해서 당신은 스스로 인증서를 가질 필요가 있습니다. DefaultHttpClient가 기본 SSLContext를 기반으로 이러한 요청을 처리하지 않기 때문에 자체 서명 인증서를 "승인"하는 SSL 컨텍스트를 사용하여 HttpURLConnection을 열고 BKS 키 저장소에 저장합니다.

당신은 내가 당신 제프 여섯 편집 오라일리을하여 책 "안드로이드 플랫폼에 대한 응용 프로그램 보안"을 읽을 것을 권장 SSL에 대한 자세한 내용을 원한다면 ...

감사합니다!

관련 문제