2012-05-08 6 views
3

私はAndroidが初めてです。アプリケーションでは、Android上でプレーンなTCPソケットをSSLソケット(サーバーモード)にアップグレードする必要があります。次のコードは機能しましたが、Android 2.3.3(API 10)のSamsung Galaxy SでSSLハンドシェイクを完了するまでに約12秒かかりました。私もアンドロイド4.0.3(API 15)のシミュレータで同じコードをテストしましたが、結果は同じでした。クライアントはChromeブラウザでした。 Wiresharkのトレースから、すべてのSSLハンドシェイクメッセージが非常に高速に流れ、Change Cipher Spec/Encrypted Handshakeメッセージ(サーバサイドのSSLハンドシェイクの最後の2つのメッセージ)と最初のアプリケーションデータ(これはクロムからのHTTP GET)。AndroidでサーバーモードSSL startHandshakeを完了するのに12秒かかりました

private boolean handleSSLHandshake() { 

    try { 
     SSLContext sc = SSLContext.getInstance("TLS"); 
     sc.init(this.kmf.getKeyManagers(), null, null); 
     SSLSocketFactory factory = sc.getSocketFactory();    
     this.sslSocket = (SSLSocket) factory.createSocket(this.socket, 
             this.socket.getInetAddress().getHostAddress(), 
             this.socket.getPort(), 
             true); 
     this.sslSocket.setUseClientMode(false); 
     this.sslSocket.addHandshakeCompletedListener(this); 
     this.sslSocket.startHandshake(); 
     Log.d(TAG, "SSL upgrade succeeds!"); 
     this.input = this.sslSocket.getInputStream(); 
     this.output = this.sslSocket.getOutputStream(); 
    } catch (NoSuchAlgorithmException e) { 
     Log.d(TAG, "Got NoSuchAlgorithmException while upgrading to SSL" + e); 
     this.sslSocket = null; 
     return false; 
    } catch (KeyManagementException e) { 
     Log.d(TAG, "Got KeyManagementException while upgrading to SSL" + e); 
    } catch (UnknownHostException e) { 
     Log.d(TAG, "Got UnknownHostException while upgrading to SSL" + e); 
     this.sslSocket = null; 
     return false; 
    } catch (IOException e) { 
     Log.d(TAG, "Got IOException while upgrading to SSL" + e); 
     this.sslSocket = null; 
     return false; 
    } 
    return true; 
} 

public void handshakeCompleted(HandshakeCompletedEvent event) { 

    Log.d(TAG, "SSL handshake completed"); 
} 

コードに10秒かかりましたか?これを減らすには?そして、Android上でSSLハンドシェイクをデバッグする方法は?助けのための

どうもありがとう、

/Kaiduan

+0

なぜclientModeをfalseに設定していますか?サーバーはclientMode = trueに設定されていますか?これはデフォルトではなく、変更することは非常にまれです。 – EJP

+0

SSLサーバのハンドシェイクは間違いなくその時間を取るべきではありません。 Androidのテストケースには、SSLサーバーの実行が含まれていますが、あまり時間がかかりません。どこで証明書を取得していますか?それは10秒かかることかもしれません。証明書生成に時間がかかる傾向があります。 –

答えて

0

あなたは、CPUがそれらの10秒の間にビジー状態であるかどうかを確認するために、デバイスの負荷を監視することができます。また、異なるデバイスやエミュレータで同じ結果が得られるかどうか試してみてください。もう一つの可能​​性はDNSで待っていることですが、それは遅く起こるべきではありません。パケットキャプチャでDNSクエリを確認します。

+0

これに関連する可能性がありますhttp://code.google.com/p/android/issues/detail?id=13117 –

関連する問題