我在应用程序启动时在我的应用程序中安装证书。我已经完成了以下几个链接,并成功安装了证书。
http://nelenkov.blogspot.in/2011/12/ics-trust-store-implementation.html
How to programmatically install a CA Certificate (for EAP WiFi configuration) in Android?
how to install CA certificate programmatically on Android without user interaction
我发现我们无法在没有用户交互的情况下安静地安装证书。目前我不知道每次用户打开我的应用程序时如何停止提示。
每当我的应用程序每次都要求用户安装证书时,它就会启动。有没有办法可以通过编程方式检测证书(在这种情况下是我的证书)是否已经安装。
我在我的应用中安装证书的代码段
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,从onCreate()调用installCertificate()。
请帮帮我。任何帮助将不胜感激。
查询:当出现证书名称提示时,输入的文本将显示为已选中且方向更改剪切/复制选项出现。当提示到来时,任何机构都知道如何停止文本选择?!!!
答案 0 :(得分:20)
我使用下面的代码来检查我的证书是否已安装
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();
}
答案 1 :(得分:1)
KeyChain.createInstallIntent,创建的intent将调用android.security.certinstaller来安装证书,然后certinstaller将在安装证书时打印日志。所以你可以转储日志cat以检查是否安装了证书。(如果用户更改了证书的商店名称,你可以获得别名)
答案 2 :(得分:0)
从受信任的CA商店中读取
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
只会获取CA证书而不是用户/客户端证书。客户端证书不必共享与CA证书相同的别名。