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

标签 android ssl https ssl-certificate x509certificate

我一直在 raw 文件夹下的 android 应用程序中使用服务器团队提供的 ssl 证书 key 。它最初工作正常。

     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:找不到证书路径的信任 anchor 。

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

编辑:

评论后,提供一些额外的信息。

keystore :我使用的是默认 keystore 。 CA :我正在使用 digicert CA。这些人值得信赖。

最佳答案

这种问题往往是链证书丢失引起的。根据 SSLLabs 检查您的网站并寻找不完整链的报告。请注意,像 Chrome 这样的桌面浏览器可能仍然可以工作,因为它们会缓存来自早期连接的链证书,有时甚至会主动尝试从互联网上检索丢失的链证书。

关于使用 digicert 在服务器中更新证书后出现 Android ssl 证书错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40023948/

相关文章:

ssl - Nginx SSL 什么都不返回

android - 当 ShapeDrawable 设置为图标时,ActionBar 项目不显示

Java - Android - view.getContext() 含义

java - 每隔 X 行将 Admob 横幅添加到 ListView

curl - Heroku SSL 问题给我验证失败

ssl - Master-Secret是什么时候计算出来的?谁来计算?

ssl - 如何调试 https 设置?

android - 简单的日期格式给出错误的时间

asp.net - SSL 系统.Security.Authentication.AuthenticationException :

http - 如何以编程方式测试网站是否使用 HTTPS?