2011-03-28 5 views
7

현재 Android (2.2) 용 클라이언트 부분과 SSL을 사용하는 서버를 작성하고 있습니다. 나는 서버와 일반 클라이언트간에 메시지를 교환 할 수 있었지만, 안드로이드는 자기 서명 인증서에 대해 너무 행복하지 않은 것처럼 보인다. Stackoverflow 및 Googled 많이 검색 한 사람들이 많은 비슷한 문제가 있습니다. 지금까지 발견 한 모든 대답은 작동하지 않았거나 아무런 의미가 없습니다. HTTPS에 대한 코드 샘플은 대부분 있지만, 소켓을 통해 통신해야하므로 사용할 수 없습니다 (SSLSocket이 가장 좋습니다). 나는 많은 다른 코드를 시도했지만, 지금은 다시 0으로 돌아 간다.Android의 SSL 클라이언트

지금까지 인증서를 생성해야한다는 것을 알았습니다. 분명히 나는 ​​어떤 실제 코드를 찾을 수 없었기 때문에 여기에 묻는 이유가있다. 보통 대단히 도움이되는 사람들이 있기 때문이다.

내가해야 할 일에 대한 자세한 설명과 작동하는 Android 클라이언트 코드로 만들 수있는 코드를 찾고 있습니다. 사전에

덕분에

답변

1

나는 네이티브 안드로이드 브라우저를 포팅을 완료했다. SSL 컨텍스트가 생성되는 방법을 방금 변경했습니다. 나는 나는 또한

https://market.android.com/details?id=org.sandrob

http://code.google.com/p/sandrob/source/browse/misc/examples/HttpsConnection.java

+0

답장을 보내 주셔서 감사합니다. 내가 링크 된 코드를 살펴본 결과 흥미 롭습니다. 문제는 맞춤 클래스로 보이는 많은 클래스를 사용한다는 것입니다. Google에서 일부를 검색하여 다른 라이브러리에서 구현 된 것으로 나타났습니다. CertificateChainValidator가 android.net.http 패키지에 있어야한다고 생각합니다. 그러나 거기에는 없습니다. 표준 라이브러리를 사용하여 단순화 된 전체 작동 예제가 있습니까? – Casper

1

CertificateChainValidator 안드로이드 소스의 일부입니다 :) ... SandroB 사이트에서 일부 작업 예제를 넣어하지만 것이라는 점을 약속했다. 는 적어도 버전/태그 2.2.1_r1

은 당신이 안드로이드 소스에서 브라우저를 구축하고 의 SSLContext가 HttpsConnection.java 파일에 초기화 얼마나 변경할 수 있습니다 작동하게합니다.

keyManagers (cerfile/password로 초기화 됨) 및 trustManagers (모두 신뢰)가 필요합니다.

sslContext.engineInit (keyManagers, trustManagers, null, cache, null);

+1

안녕하세요. 가져올 수없는 것 같아서 http://developer.android.com/reference/android/net/http/package-summary.html에 따르면 함수가 존재하지 않는 것 같습니다. 내가 아는 한 인증서를 처리 할 세관 관리자를 만들어야하지만 아직 작동중인 코드를 찾고 있습니다. 나는 안드로이드 2.2 (API 8)를 사용하고 있습니다. – Casper

1
public class MySSLSocketFactory extends SSLSocketFactory { 
    SSLContext sslContext = SSLContext.getInstance("TLS"); 

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { 
     super(truststore); 

     TrustManager tm = new X509TrustManager() { 
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
     }; 

     sslContext.init(null, new TrustManager[] { tm }, null); 
    } 

    @Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { 
     return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
     return sslContext.getSocketFactory().createSocket(); 
    } 
} 

그리고 당신은 HttpClient를

public HttpClient getNewHttpClient() { 
     try { 
      KeyStore trustStore = KeyStore.getInstance(KeyStore 
        .getDefaultType()); 
      trustStore.load(null, null); 

      SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
      sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

      HttpParams params = new BasicHttpParams(); 
      HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
      HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

      SchemeRegistry registry = new SchemeRegistry(); 
      registry.register(new Scheme("http", PlainSocketFactory 
        .getSocketFactory(), 80)); 
      registry.register(new Scheme("https", sf, 443)); 

      ClientConnectionManager ccm = new ThreadSafeClientConnManager(
        params, registry); 

      return new DefaultHttpClient(ccm, params); 
     } catch (Exception e) { 
      return new DefaultHttpClient(); 
     } 
    } 

입니다은 당신을 도움이되기를 바랍니다.

관련 문제