Android - SSL / TLS和ECC(椭圆曲线加密)

时间:2012-02-02 15:27:30

标签: android https bouncycastle

我正在开发一个与Web服务器通信的Android应用程序。我们使用HTTPS进行此通信,并且我们在Android应用程序内部还有一个客户端证书用于身份验证。

我们使用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)
(...)

我试图找到一个ECC和SSL的例子,但我没有找到任何东西。我发现了几篇关于加密和密钥对生成的文章(例如http://nelenkov.blogspot.com/2011/12/using-ecdh-on-android.html#!/2011/12/using-ecdh-on-android.html),但没有任何与此类SSL错误相关的内容。

我们将不胜感激任何反馈。提前谢谢!!

1 个答案:

答案 0 :(得分:0)

默认Android 7.0 SSLSocketFactory不支持OpenSSL / BoringSSL已知的所有椭圆曲线。握手仅在Client Hello中的secp256r1中列出supported_curves

SSLEngine文档甚至没有提到支持的曲线。

如果服务器不能同意使用该曲线,它将关闭连接,并且在显示I / O错误的情况下,客户端的握手失败。

Android上的Chrome支持3条常见曲线,secp256r1secp384r1x25519

编辑

我应该添加签名哈希算法支持扩展包括带有SHA1到SHA512的ECDSA,所以在服务器端使用ECDSA证书应该没问题。