2011-12-06 66 views
2

首先我知道這裏有很多話題。他們中的大多數人都默認信任所有證書/主機,因爲環境和安全性完全沒有問題。Android 2.2 SSL庫錯誤

2.3我有一個功能齊全的SSL客戶端,但是當試圖在2.2上運行時,我得到一個讀錯誤:在SSL庫中失敗,然後它說下一行(openssl_v3)unkown ca.

事情是我已經按照Crazybob和安東尼對字幾次博客字沒有影響(這就是我得到了它2.3工作)

我工作的組織是我們自己的CA,服務器端口我連接到已被限制爲只允許授權的客戶端證書,我有一個密鑰庫。 2.3版本有2個BKS商店,一個有客戶證書,另一個有特定的服務器證書。

我試着將RootCA和Trusted Authority證書放在服務器存儲器中,但它仍然有相同的錯誤,所以除非它們按照確切的順序進入我很難過。

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; 
     } 
    } 

堆棧跟蹤如下所示:

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) 

它的WebService引用該生產線是:

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