Обнаружить установленный сертификат в моем устройстве Android
Я устанавливаю сертификат в своем приложении, когда приложение запускается. Я просмотрел несколько ссылок, как показано ниже, и успешно установил сертификат.
Я понял, что мы не можем установить сертификат без участия пользователя. В настоящее время я не знаю, как остановить запрос каждый раз, когда пользователь открывает мое приложение.
Всякий раз, когда мое приложение запускается в настоящее время каждый раз, когда он просит пользователя установить сертификат. Есть ли способ определить, установлен ли сертификат (в данном случае мой сертификат) или нет, программно.
Фрагмент кода, где у меня установлен сертификат в моем приложении
private void installCertificate()
{
try
{
BufferedInputStream bis = new BufferedInputStream(getAssets().open(MY_CERT));
byte[] keychain = new byte[bis.available()];
bis.read(keychain);
Intent installIntent = KeyChain.createInstallIntent();
X509Certificate x509 = X509Certificate.getInstance(keychain);
installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509.getEncoded());
installIntent.putExtra(KeyChain.EXTRA_NAME, MY_CERT);
startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE);
}
catch (IOException e) {
e.printStackTrace();
}
catch (CertificateException e)
{
e.printStackTrace();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == INSTALL_KEYCHAIN_CODE)
{
switch (resultCode)
{
case Activity.RESULT_OK:
doTheTask();
break;
case Activity.RESULT_CANCELED:
finish();
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
}
Также FYI, installCertificate() вызывается из onCreate().
Пожалуйста, помогите мне за то же самое. Любая помощь будет оценена.
Запрос: Когда запрашивается приглашение для имени сертификата, введенный текст поступает так, как выбрано, и при выборе варианта смены разрешения/копирования. Любое тело знает, как остановить выбор текста, когда появится подсказка?!!!
Ответы
Ответ 1
Я использовал ниже фрагмент кода, чтобы проверить, установлен ли мой сертификат или нет
try
{
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
if (ks != null)
{
ks.load(null, null);
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements())
{
String alias = (String) aliases.nextElement();
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias);
if (cert.getIssuerDN().getName().contains("MyCert"))
{
isCertExist = true;
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (java.security.cert.CertificateException e) {
e.printStackTrace();
}
Ответ 2
Добавление дополнительной информации в ответ @Android (я еще не могу прокомментировать), чей код работал у меня только на устройствах с Android 4.0 или выше.
Для устройств pre IceCream Sandwich (API < 14):
boolean isCertExist;
TrustManagerFactory tmf;
try {
tmf = TrustManagerFactory.getInstance(TrustManagerFactory
.getDefaultAlgorithm());
tmf.init((KeyStore) null);
X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0];
for (X509Certificate cert : xtm.getAcceptedIssuers()) {
if (cert.getIssuerDN().getName().contains("MyCert")) {
isCertExist = true;
break;
}
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Для устройств с Android 4.0 и выше (API >= 14):
boolean isCertExist;
try
{
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
if (ks != null)
{
ks.load(null, null);
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements())
{
String alias = (String) aliases.nextElement();
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias);
if (cert.getIssuerDN().getName().contains("MyCert")) {
isCertExist = true;
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (java.security.cert.CertificateException e) {
e.printStackTrace();
}
Ответ 3
KeyChain.createInstallIntent, созданное намерение вызовет android.security.certinstaller для установки сертификатов, затем certinstaller будет печатать журнал при установке сертификатов. поэтому вы можете сбросить лог-журнал, чтобы проверить, установлен ли сертификат. (вы можете получить псевдоним, если пользователь изменил имя хранилища сертификата)
Ответ 4
Считывание из надежного хранилища CA, как показано ниже
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
будет получать только сертификаты ЦС, а не сертификаты пользователя и клиента. Нет необходимости, чтобы клиентский сертификат имел тот же псевдоним, что и сертификат CA.