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
使用digicert在服务器中续订证书后出现Android ssl证书错误_Android_Ssl_Https_Ssl Certificate_X509certificate - Fatal编程技术网

使用digicert在服务器中续订证书后出现Android ssl证书错误

使用digicert在服务器中续订证书后出现Android ssl证书错误,android,ssl,https,ssl-certificate,x509certificate,Android,Ssl,Https,Ssl Certificate,X509certificate,我一直在使用服务器团队在原始文件夹下的android应用程序中提供的ssl证书密钥。它最初运行良好 CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInputMmx = new BufferedInputStream(this.getAssets().open("123.crt")); Certificate caMmx = cf.genera

我一直在使用服务器团队在原始文件夹下的android应用程序中提供的ssl证书密钥。它最初运行良好

     CertificateFactory cf = CertificateFactory.getInstance("X.509");

        InputStream caInputMmx = new BufferedInputStream(this.getAssets().open("123.crt"));
        Certificate caMmx = cf.generateCertificate(caInputMmx);
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("caMmx", caMmx);
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);
        client.setSslSocketFactory(context.getSocketFactory());
几天后,证书过期,服务器团队更新了证书。从那时起,我们的android应用程序停止工作,出现以下异常

com.android.volley.NoConnectionError:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点。

在使用来自服务器的新续订证书时,我们的应用程序工作正常。是否有任何解决方法可以从服务器修复此问题,而不是每次更新应用程序中的新证书?因为如果用户不更新应用程序,我们的应用程序将无法工作。因此,如果证书过期,是否有办法解决此问题,而不是每次更新应用程序中的证书

编辑:

在评论之后,提供一些附加信息

密钥库:我使用的是默认密钥库。
CA:我使用的是digicert CA。这些人是值得信任的。

这种问题通常是由于缺少链证书造成的。检查您的站点,并查找不完整链的报告。请注意,像Chrome这样的桌面浏览器可能仍然可以工作,因为它们缓存来自早期连接的链证书,有时甚至主动尝试从internet检索丢失的链证书。

@pradeep.k:您的代码不显示验证,只显示证书的加载。从显示的代码中,不清楚是否使用了固定。即使有额外的信息,也不清楚您是将钉扎附加到正常验证还是专门使用。还不清楚您是在进行证书固定还是公钥固定,以及续订的证书是否使用相同的公钥。另外,如果您专门进行固定,那么您根本不需要在证书过期时更换证书。@pradeep.k:现在和将来如何解决这个问题取决于您具体如何进行固定。请参阅我的评论,其中我指出了所有缺少的信息并提供了缺少的详细信息,最好是编辑您的问题,而不是将其发布在评论中。@pradeep.k:这看起来不像是证书固定,但看起来您只是将自己的CA添加到密钥存储中。如果仅此而已,那么您只需接受这些CA颁发的证书。我认为您需要提供更多信息,即新证书与您在应用程序中信任的CA的关系。也可能是您将信任的自签名证书准确地添加到存储中,但这不能仅从代码中看到,因为添加的证书和使用的证书的内容未知。@pradeep.k:不,您不能通过在服务器上配置某些内容来绕过安全性。您只能确保服务器提供受信任的证书,即信任存储中CA颁发的证书。@pradeep.k:CA不提供密钥,而是对证书进行签名。如果颁发CA在密钥存储中配置为受信任(同样:这是未知的),则如果在服务器上正确配置了证书,则该CA应在不更改应用程序的情况下工作。如果是这样的话,这也是未知的。同样,请在问题中添加回答问题所需的任何详细信息,而不是在评论中。理想情况下,需要有关您加载为受信任的证书、叶证书和服务器发送的任何链证书及其与受信任CA的关系的信息。