Java SSL不适用于Android 2.2(仅适用于2.3)
当调用httpsURLConnection.getInputStream()时,我在LogCat上得到了这个消息 SSL握手失败:SSL库中的失败,通常是协议 错误:14094412:SSL例程:SSL3_读取字节:sslv3警报错误 证书(外部/openssl/ssl/s3_pkt.c:1127 0x29eb40:0x00000003) 我已经在Andorid2.3上进行了测试,效果很好 我的服务器需要客户端身份验证!也许FROYO不支持这种握手。。。我不知道 我也尝试过使用httpclient。在任何情况下都会失败…Java SSL不适用于Android 2.2(仅适用于2.3),java,android,sockets,ssl,https,Java,Android,Sockets,Ssl,Https,当调用httpsURLConnection.getInputStream()时,我在LogCat上得到了这个消息 SSL握手失败:SSL库中的失败,通常是协议 错误:14094412:SSL例程:SSL3_读取字节:sslv3警报错误 证书(外部/openssl/ssl/s3_pkt.c:1127 0x29eb40:0x00000003) 我已经在Andorid2.3上进行了测试,效果很好 我的服务器需要客户端身份验证!也许FROYO不支持这种握手。。。我不知道 我也尝试过使用httpclien
private void process() throws Exception {
char[] pass = "clientpass".toCharArray();
InputStream ksStream = getAssets().open("clientKeyStore.bks");
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(ksStream, pass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, pass);
ksStream.close();
X509TrustManager[] tm = new X509TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
} };
SSLContext context = SSLContext.getInstance("TLS");
context.init(kmf.getKeyManagers(), tm, null);
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
URL url = new URL("https://192.168.2.101:8443/RestTomcat/resources/veiculos/KKK1234");
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null)
sb.append(line + "\n");
br.close();
Log.e("OUTPUT", sb.toString());
httpsURLConnection.disconnect();
}
确保2.2设备上的日期、时间和时区设置正确。我不确定您是否找到了答案,但这似乎是Android 2.2不必分析完整证书链的一个缺陷。如果你的.p12证书有多个链,那么安卓2.2似乎并没有遵循整个链 我的问题和我问的问题一样。我要求我们的管理员生成一个新的客户端证书,该证书由根CA直接颁发,而不需要子CA,之后2.2将起作用。不过,它确实带来了一个安全性问题,即在没有子CA作为中介的情况下拥有客户端证书 更新:
Android团队确认这是2.1/2.2中的一个问题。详细信息在中,故障是在Android Logcat还是服务器日志中?“到底是哪一行代码出错了?”Jakar更新了!当调用httpsURLConnection.getInputStream()时,我在LogCat上得到了这个消息。我认为受信任的CA之间存在差异。谁签署了那个证书?@rekire所有的证书都是自签名的。@CelinHC你找到解决这个问题的方法了吗?我拼命想找到解决办法。我猜2.2并没有发送一个完整的证书链,但无法在任何地方得到确认。如果你已经找到了解决方案,我会很感激你发表你自己的答案,你会得到我的投票。谢谢在两种设备中完全相同。。。Galaxy标签(Android 2.2)和Nexus S(Android 2.3)在我的例子中,我有一个自签名证书。。。那么,我迷路了吗?还有其他的解决办法,用我最后做的其他方法替换原来的Android Socket实现,因为最终他们仍然需要一个更安全的从子CA到根CA链的子CA。这些步骤相当复杂,但(到目前为止)仍然有效。让我知道如果你有兴趣尝试它,我可以把它的答案。我还在Android上发布了一个bug,他们确认这是一个错误