2011-12-06 4 views
2

우선이 주제에 대한 많은 정보가 있습니다. 대부분의 보안 담당자는 환경과 보안이 완전히 위배되는 경우 기본적으로 모든 인증서/호스트를 신뢰합니다.Android 2.2 SSL 라이브러리 오류

2.3에서는 완전히 작동하는 SSL 클라이언트를 가지고 있지만 2.2에서 실행하려고 할 때 읽기 오류가 발생합니다. SSL 라이브러리에서 오류가 발생하고 다음 줄에 (openssl_v3) unkown ca가 표시됩니다. 내가 일하는 조직은 우리 자신의 CA, 서버 포트입니다

(내가 그것을 2.3 작업을 얻었는지 그게 전부)

것은 내가 아무 영향에 단어 몇 번에 대한 Crazybob과 앙투안의 블로그의 말씀을 따랐습니다한다 나는 오직 하나의 키 저장소에있는 권한있는 클라이언트 인증서 만 허용하도록 제한되었습니다. 2.3 버전에는 클라이언트 인증서가있는 BKS 스토어와 특정 서버의 인증서가있는 BKS 스토어가 있습니다.

서버 저장소에 RootCA 및 신뢰할 수있는 인증 기관의 인증서를 넣으려고했으나 동일한 오류가 발생하여 정확한 순서로 전달되지 않으면 문제가 발생합니다.

public class WebService 
{ 
    Context context; 
    InputStream serverin; 
    InputStream clientin; 
    DefaultHttpClient httpClient; 

    public WebService(Context context, InputStream serverin, InputStream clientin) 
    { 
     this.context = context; 
     this.serverin = serverin; 
     this.clientin = clientin; 
     this.httpClient = newConnection(); 
    } 

     public DefaultHttpClient newConnection() { 
     // Set basic data 
     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, "UTF-8"); 
     HttpProtocolParams.setUseExpectContinue(params, true); 
     HttpProtocolParams.setUserAgent(params, "Android app/1.0.0"); 
     // Make pool 

     ConnPerRoute connPerRoute = new ConnPerRouteBean(12); 
     ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute); 
     ConnManagerParams.setMaxTotalConnections(params, 20); 
     // Set timeout 
     HttpConnectionParams.setStaleCheckingEnabled(params, false); 
     HttpConnectionParams.setConnectionTimeout(params, 20 * 1000); 
     HttpConnectionParams.setSoTimeout(params, 20 * 1000); 
     HttpConnectionParams.setSocketBufferSize(params, 8192); 

     // Some client params 
     HttpClientParams.setRedirecting(params, false); 
     // Register http/s shemas! 
     SchemeRegistry schReg = new SchemeRegistry(); 
     schReg.register(new Scheme("http", PlainSocketFactory 
       .getSocketFactory(), 80)); 
     schReg.register(new Scheme("https", newSSLSocketFactory(), 3400)); 

     ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
       params, schReg); 
     DefaultHttpClient sClient = new DefaultHttpClient(conMgr, params);  
     return sClient; 
    } 

    private SSLSocketFactory newSSLSocketFactory() { 
     try { 
      // setup truststore to provide trust for the server certificate 
      // load truststore certificate 

      KeyStore trustStore = null; 
      trustStore = KeyStore.getInstance("BKS"); 
      trustStore.load(serverin, "(not telling)".toCharArray()); 

      System.out.println("Loaded server certificates: " 
        + trustStore.size()); 

      // initialize trust manager factory with the read truststore 
      TrustManagerFactory trustManagerFactory = null; 
      trustManagerFactory = TrustManagerFactory 
        .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
      trustManagerFactory.init(trustStore); 

      // setup client certificate 
      // load client certificate 
      KeyStore keyStore = null; 
      keyStore = KeyStore.getInstance("BKS"); 
      keyStore.load(clientin, "(not telling)".toCharArray()); 
      System.out 
        .println("Loaded client certificates: " + keyStore.size()); 
      // initialize key manager factory with the read client certificate 

      KeyManagerFactory keyManagerFactory = null; 
      keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory 
        .getDefaultAlgorithm()); 
      keyManagerFactory.init(keyStore, "(not telling)".toCharArray()); 

      // initialize SSLSocketFactory to use the certificates 
      SSLSocketFactory socketFactory = null; 
      socketFactory = new SSLSocketFactory(SSLSocketFactory.TLS, 
        keyStore, "(not telling)", trustStore, null, null); 

      return socketFactory; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

는 스택 트레이스는 다음과 같습니다 : 그것은 WebService에 언급

12-06 09:13:47.739: W/System.err(280): java.io.IOException: Read error: Failure in SSL library, usually a protocol error 
12-06 09:13:47.799: W/System.err(280): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeread(Native Method) 
12-06 09:13:47.810: W/System.err(280): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.access$300(OpenSSLSocketImpl.java:55) 
12-06 09:13:47.810: W/System.err(280): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:542) 
12-06 09:13:47.819: W/System.err(280): at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
12-06 09:13:47.819: W/System.err(280): at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
12-06 09:13:47.819: W/System.err(280): at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82) 
12-06 09:13:47.819: W/System.err(280): at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
12-06 09:13:47.829: W/System.err(280): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
12-06 09:13:47.829: W/System.err(280): at (my package).WebService.webGet(WebService.java:75) 
12-06 09:13:47.829: W/System.err(280): at (my package).HardwareHoundActivity.onCreate(HardwareHoundActivity.java:107) 
12-06 09:13:47.829: W/System.err(280): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
12-06 09:13:47.829: W/System.err(280): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
12-06 09:13:47.829: W/System.err(280): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
12-06 09:13:47.829: W/System.err(280): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
12-06 09:13:47.829: W/System.err(280): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
12-06 09:13:47.829: W/System.err(280): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-06 09:13:47.829: W/System.err(280): at android.os.Looper.loop(Looper.java:123) 
12-06 09:13:47.839: W/System.err(280): at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-06 09:13:47.839: W/System.err(280): at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 09:13:47.839: W/System.err(280): at java.lang.reflect.Method.invoke(Method.java:521) 
12-06 09:13:47.839: W/System.err(280): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-06 09:13:47.839: W/System.err(280): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-06 09:13:47.839: W/System.err(280): at dalvik.system.NativeStart.main(Native Method) 

라인은 다음과 같습니다

HttpResponse response = httpClient.execute(httpGet); 
+0

나는 같은 문제가 있습니다 ... http://stackoverflow.com/questions/9300821/ssl-not-working-on-android-2-2-only-in-2-3 아무도 없습니까? – CelinHC

답변

0

네이티브 OpenSSL이 수준에서 오류처럼 보인다. 전체 스택 추적을 게시 할 수 있습니까? 귀하의 코드가 올바른지, 나는 당신이 KeyManagerFactory 비트가 필요하다고 생각하지 않습니다, 당신이 (당신처럼) 키 스토어를 통과하면 httpclient의 SSLSocketFactory가 이것을 처리합니다.

+0

스택 포스트를 메인 포스트에 추가했습니다. 응답 해 주셔서 감사합니다. – IainS

+0

2.2는 서버가 사용하는 SSL 프로토콜 버전이나 암호를 지원하지 않습니다. 현재 2.2 소스가 없으므로 정확히 지원하는지 확인할 수 없습니다. 서버 설정 및 서버 로그를 점검하여 사용 중이거나 사용하려고하는 프로토콜을 확인하십시오. –

+0

확인했습니다. 서버가 SSLv3을 실행하고 있습니다. – IainS