Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
Android SSL错误:证书不受信任…;有时_Android_Ssl_Https_Certificate - Fatal编程技术网

Android SSL错误:证书不受信任…;有时

Android SSL错误:证书不受信任…;有时,android,ssl,https,certificate,Android,Ssl,Https,Certificate,在我正在使用的应用程序中,我必须与web服务器建立HTTPS连接。我收到证书不可信错误,在咨询stackoverflow后,我发现了以下日志: 这台服务器的CA似乎不包括在Android的默认存储中。简而言之,我下载了所有证书,使用BKS提供程序创建了密钥库,导入了密钥,将密钥库导入到我的项目中,对DefaultHttpClient类进行子类化,以强制它使用我的密钥库 按照博客中的步骤操作后,它在模拟器上运行得非常好。但是,当我在设备上测试它时,它会间歇性地失败。我想我已经找到了一个模式。似乎过

在我正在使用的应用程序中,我必须与web服务器建立HTTPS连接。我收到证书不可信错误,在咨询stackoverflow后,我发现了以下日志:

这台服务器的CA似乎不包括在Android的默认存储中。简而言之,我下载了所有证书,使用BKS提供程序创建了密钥库,导入了密钥,将密钥库导入到我的项目中,对DefaultHttpClient类进行子类化,以强制它使用我的密钥库


按照博客中的步骤操作后,它在模拟器上运行得非常好。但是,当我在设备上测试它时,它会间歇性地失败。我想我已经找到了一个模式。似乎过了一段时间后,我尝试建立HTTPS连接,它将失败。然后,如果我再次尝试相同的连接,它将成功。如果我等待一段时间,然后再试一次,第一次失败,重复尝试成功。我也许可以通过多次尝试失败来修复它,但我想知道发生了什么。该行为表明存在某种缓存,但我不知道如何查找或修改其行为。有没有人对正在发生的事情有任何建议,或者知道我做错了什么?如果有任何帮助,我们将不胜感激。

纯粹是猜测,但我在Windows/IE环境中处理过类似的情况,当时证书间歇性失败。在这两种情况下,我都有代理人,但我没有意识到他们在充当代理人

第一个是Fiddler——一个web调试器,当我使用它时,它将证书代理给浏览器

第二次,我对我们的公司互联网过滤解决方案(Web Sense)产生了问题,该解决方案也充当代理,有点-它最终将允许证书信息正确通过,但不是第一次尝试


我不知道这是否是您的情况,但这是我唯一一次看到您所描述的行为。

在打开连接之前,您可以创建一个不验证证书链的
TrustManager
,并将其安装到您的HttpsURLConnection。见下文:

`

`

private static void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }

        public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }
    } };


    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}