【发布时间】:2017-10-19 21:08:30
【问题描述】:
我正在开发一个与 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 错误相关的文章。
我们将不胜感激任何反馈。提前谢谢你!
【问题讨论】:
-
您确定客户端和服务器都支持ECC证书吗? ECC 是一种稀有鸟类。
-
我知道 IIS 支持 ECC 证书,因为我使用 IExplorer 和 Firefox 进行了测试。我不知道android是否支持ECC证书。我在 Android 上使用 ECC 密码进行了一些小测试,但对证书一无所知。
标签: android https bouncycastle