gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:07:40 24 4
gpt4 key购买 nike

我正在开发一个与网络服务器通信的安卓应用程序。我们使用 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 的示例,但我没有找到任何东西。我找到了几篇关于加密和 key 对生成的文章(例如 http://nelenkov.blogspot.com/2011/12/using-ecdh-on-android.html#!/2011/12/using-ecdh-on-android.html ),但与这种 SSL 错误无关。

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

最佳答案

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

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

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

Android 上的 Chrome 但是支持 3 种常见曲线,secp256r1secp384r1x25519

编辑

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

关于Android - SSL/TLS 和 ECC(椭圆曲线加密),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9114950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com