我一直在使用原始文件夹下的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:找不到证书路径的信任锚。
在使用来自服务器的新续订证书时,我们的应用程序运行正常。是否有任何解决方法可以从服务器修复此问题,而不是每次都在应用程序中更新新证书?因为如果用户没有更新应用程序,我们的应用程序将无法运行。如果证书过期,那么有没有办法解决这个问题,而不是每次更新应用程序中的证书。
编辑:
评论后,提供一些额外的信息。
密钥库:我使用的是默认密钥库。 加利福尼亚州:我正在使用digicert CA。这些人都很信任。
答案 0 :(得分:4)
这种问题通常是由缺少链证书引起的。针对SSLLabs检查您的网站,并查找链不完整的报告。请注意,像Chrome这样的桌面浏览器可能仍然有效,因为它们会缓存早期连接中的链证书,有时甚至会主动尝试从互联网上检索丢失的链证书。