Я использовал ключ сертификата ssl, предоставленный серверной командой в приложении для Android в необработанной папке. Первоначально он работал нормально.
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, этим парням доверяют.