2012-02-02 11 views
2

私はWebサーバーと通信するアンドロイドアプリケーションを開発しています。この通信にはHTTPSが使用されており、認証のためにアンドロイドアプリケーション内にクライアント証明書もあります。Android - SSL/TLSとECC(楕円曲線暗号)

非常に小さな証明書を得るために、ECC(ANSI x9.62)を使用してSSL証明書を作成し、ハンドシェイク中の伝送コストを削減できます。

通信のためのソースコードは、多かれ少なかれ、このようなものです:

E/NativeCrypto(4744): Unknown error 5 during connect 
W/System.err(4744): java.io.IOException: SSL handshake failure: I/O error during system call, Connection reset by peer 
W/System.err(4744):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native Method) 
W/System.err(4744):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:316) 
W/System.err(4744):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:520) 
W/System.err(4744):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:461) 
W/System.err(4744):  at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93) 
W/System.err(4744):  at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83) 
W/System.err(4744):  at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170) 
W/System.err(4744):  at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106) 
W/System.err(4744):  at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129) 
(...) 

私は見つけることTRID:

InputStream keystoreIs = getResources().openRawResource(R.raw.client_bks); 
KeyStore keystore = KeyStore.getInstance("BKS"); 
keystore.load(keystoreIs, KEYSTORE_PASSWORD); 

SSLSocketFactory socketFactory = new SSLSocketFactory(keystore, KEYSTORE_PASSWORD, keystore); 
Scheme serverScheme = new Scheme("https", socketFactory, SERVER_PORT); 
HttpClient httpclient = new DefaultHttpClient(); 
httpclient.getConnectionManager().getSchemeRegistry().register(iServerScheme); 
HttpPost httppost = new HttpPost(SERVER_URL); 
HttpResponse response = httpclient.execute(httppost); 

問題は、我々のようなエラーが接続しようとするということですECCとSSLの例ですが、何も見つかりませんでした。私は、暗号化と鍵ペアの生成に関するいくつかの記事(たとえばhttp://nelenkov.blogspot.com/2011/12/using-ecdh-on-android.html#!/2011/12/using-ecdh-on-android.html)を見つけましたが、このSSLの種類のエラーは何も見つかりませんでした。

フィードバックをいただければ幸いです。前もって感謝します!!

+1

ECC証明書がクライアントとサーバーの両方でサポートされていますか? ECCはまれな鳥です。 –

+0

IExplorerとFirefoxでテストしたので、ECC証明書がIISでサポートされていることは知っています。私が知らないことは、ECC証明書がアンドロイドによってサポートされているかどうかです。私はAndroidでECC暗号を使用していくつかの小さなテストをしていますが、証明書については考えていません。 – Kosmo

答えて

0

デフォルトのAndroid 7.0 SSLSocketFactoryは、OpenSSL/BoringSSLで知られているすべての楕円曲線をサポートしていません。ハンドシェークは、クライアントHelloのsupported_curvesにあるsecp256r1をリストします。

SSLEngineのドキュメントには、サポートされているカーブについての説明はありません。

サーバがそのカーブの使用に同意できない場合、接続が閉じられ、クライアント側でハンドシェイクが失敗し、I/Oエラーが表示されます。

Android搭載Chromeは、3つの共通曲線、secp256r1secp384r1x25519をサポートしています。

サーバー側でECDSA証明書を使用して問題ないはずですので、私は、SHA512によってSHA1とECDSAを含まない署名ハッシュアルゴリズムのサポートの拡張機能を追加する必要があります

EDIT。

関連する問題