私は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
なぜclientModeをfalseに設定していますか?サーバーはclientMode = trueに設定されていますか?これはデフォルトではなく、変更することは非常にまれです。 – EJP
SSLサーバのハンドシェイクは間違いなくその時間を取るべきではありません。 Androidのテストケースには、SSLサーバーの実行が含まれていますが、あまり時間がかかりません。どこで証明書を取得していますか?それは10秒かかることかもしれません。証明書生成に時間がかかる傾向があります。 –