Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SSL不适用于Android 2.2(仅适用于2.3)_Java_Android_Sockets_Ssl_Https - Fatal编程技术网

Java SSL不适用于Android 2.2(仅适用于2.3)

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

当调用httpsURLConnection.getInputStream()时,我在LogCat上得到了这个消息

SSL握手失败:SSL库中的失败,通常是协议 错误:14094412:SSL例程:SSL3_读取字节:sslv3警报错误 证书(外部/openssl/ssl/s3_pkt.c:1127 0x29eb40:0x00000003)

我已经在Andorid2.3上进行了测试,效果很好

我的服务器需要客户端身份验证!也许FROYO不支持这种握手。。。我不知道

我也尝试过使用httpclient。在任何情况下都会失败…

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,他们确认这是一个错误