2012-02-02 95 views
2

我正在開發一個與Web服務器通信的android應用程序。我們使用HTTPS進行此通信,並且我們在android應用程序內部還有一個用於身份驗證的客戶端證書。Android - SSL/TLS和ECC(橢圓曲線加密)

我們使用ECC(ANSI x9.62)創建了SSL證書,以便擁有非常小的證書,因此我們可以在握手期間降低傳輸成本。

的通信的源代碼是或多或少是這樣的:

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

的問題是,當我們嘗試連接,我們有這樣的錯誤:

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找到一個ECC和SSL的例子,但我沒有找到任何東西。我發現了幾篇關於加密和密鑰對生成的文章(例如http://nelenkov.blogspot.com/2011/12/using-ecdh-on-android.html#!/2011/12/using-ecdh-on-android.html),但沒有任何與此類SSL錯誤相關的文章。

我們將不勝感激。先謝謝你!!

+1

您確定客戶端和服務器均支持ECC證書嗎? ECC是一種罕見的鳥。 – 2012-02-02 15:53:00

+0

我知道IIS證書支持ECC證書,因爲我使用IExplorer和Firefox進行了測試。我不知道的是,如果ECC證書是由android支持的。我在Android上使用ECC密碼進行一些小測試,但不瞭解證書。 – Kosmo 2012-02-03 07:07:28

回答

0

默認Android 7.0 SSLSocketFactory不支持OpenSSL/BoringSSL已知的所有橢圓曲線。握手只在Client Hello中的supported_curves中列出secp256r1

SSLEngine文檔甚至沒有提及支持的曲線。

如果服務器不能同意使用該曲線,它將關閉連接,並且在客戶端握手失敗並顯示I/O錯誤。

但是,Android上的Chrome支持3條常見曲線,secp256r1secp384r1x25519

編輯

我應該通過SHA512與SHA1添加簽名的哈希算法支持擴展沒有包括ECDSA,所以它應該是罰款,在服務器端使用ECDSA證書。