Создайте экземпляр KeyStore с моим собственным сертификатом
У меня есть самозаверяющий сертификат, который я использую для связи с моим сервером. Согласно этой статье я могу создать экземпляр Keystore с моим сертификатом. Я сделал то же самое, и код работает просто отлично, я могу делать серверные звонки через HTTPS-соединение.
Когда я печатаю все сертификаты, которые есть в хранилище ключей, он печатает только те сертификаты, которые я в него вставил. Я думал, что эта реализация будет инструктировать Android доверять всем встроенным сертификатам в AndroidCAStore
и новый самозаверяющий сертификат с моего сервера.
При создании экземпляра я использовал AndroidCAStore
а также AndroidKeyStore
но проблема в том, что я не могу добавить свой самозаверяющий сертификат в хранилище ключей. Всякий раз, когда я звоню setCertificateEntry
я получаю UnsupportedMethodException
,
Я хочу создать KeyStore
у него есть весь сертификат по умолчанию из хранилища ключей Android по умолчанию и самоподписанный сертификат с моего сервера. Как это сделать?
1 ответ
public static class CustomTrustManager implements X509TrustManager{
private X509TrustManager defaultTrustManager;
private X509TrustManager localTrustManager;
public CustomTrustManager(KeyStore keyStore){
try {
defaultTrustManager = createTrustManager(null);
localTrustManager = createTrustManager(keyStore);
}catch (NoSuchAlgorithmException e){
Log.e("CustomTrustManager"," Cannot create trust manager : NoSuchAlgorithm found "+e.toString());
}catch (KeyStoreException exp){
Log.e("CustomTrustManager"," Cannot create trust manager : Keystore exception"+e.toString());
}
}
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
try {
localTrustManager.checkClientTrusted(x509Certificates, s);
} catch (CertificateException ce) {
defaultTrustManager.checkClientTrusted(x509Certificates, s);
}
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
Log.e("CustomTrustManager","Checking server trust");
try {
localTrustManager.checkServerTrusted(x509Certificates, s);
} catch (CertificateException ce) {
defaultTrustManager.checkServerTrusted(x509Certificates, s);
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] first = defaultTrustManager.getAcceptedIssuers();
X509Certificate[] second = localTrustManager.getAcceptedIssuers();
X509Certificate[] result = Arrays.copyOf(first, first.length + second.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;
}
private X509TrustManager createTrustManager(KeyStore store) throws NoSuchAlgorithmException, KeyStoreException {
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init((KeyStore) store);
TrustManager[] trustManagers = tmf.getTrustManagers();
return (X509TrustManager) trustManagers[0];
}
}