2011-12-06 6 views
2

まず第一に、これに関する多くのトピックがあることを知っています。それらのほとんどは、環境とセキュリティが完全に問題から外れているため、アンカーはデフォルトですべての証明書/ホストを信頼しています。Android 2.2 SSLライブラリエラー

2.3では完全に機能するSSLクライアントを持っていますが、2.2で実行しようとすると、読み取りエラー:SSLライブラリの失敗があり、次の行(openssl_v3)が不明です。私はのために働く組織は私たち自身のCA、サーバポートです

(私はそれが2.3に取り組んで得た方法ザッツ)

事は私がいない影響を与えるに単語数回Crazybobとアントワーヌのブログの言葉に従ってきています私は接続しているのは、私がキーストアに持っている許可されたクライアント証明書だけを許可するように制限されています。 2.3バージョンには2つのBKSストアがあり、1つはクライアント証明書ともう1つはその特定のサーバーの証明書です。

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

スタックトレースは次のようになります。それはWebサービスで参照する

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