如何在Android 4.0中安装证书列表?

如何在Android 4.0中安装证书列表?,android,certificate,x509,Android,Certificate,X509,android.security.KeyChain需要别名。但是我想获得所有已安装的X509Certificate。你不能-android.security.KeyChain没有任何方法来检索所有别名,更重要的是,甚至连它与之通信的服务都没有(KeyChain应用程序中的IKeyChainServiceAIDL接口的实现)公开一个列出所有别名的方法-因此授权和密钥库是该应用程序内部的。您可以使用类似的方法列出受信任的证书。虽然没有确切的文档记录,所以它可能会在将来的版本中出现 KeyStore

android.security.KeyChain需要别名。但是我想获得所有已安装的X509Certificate。

你不能-
android.security.KeyChain
没有任何方法来检索所有别名,更重要的是,甚至连它与之通信的服务都没有(KeyChain应用程序中的
IKeyChainService
AIDL接口的实现)公开一个列出所有别名的方法-因此授权和密钥库是该应用程序内部的。

您可以使用类似的方法列出受信任的证书。虽然没有确切的文档记录,所以它可能会在将来的版本中出现

KeyStore ks = KeyStore.getInstance("AndroidCAStore");
ks.load(null, null);
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    X509Certificate cert = (X509Certificate) 
       ks.getCertificate(alias);
    Log.d(TAG, "Subject DN: " + 
       cert.getSubjectDN().getName());
    Log.d(TAG, "Subject SN: " + 
       cert.getSerialNumber().toString());
    Log.d(TAG, "Issuer DN: " + 
       cert.getIssuerDN().getName());
}
列出可用的证书:
public void PrintInstalledCertificates(){
尝试
{
KeyStore ks=KeyStore.getInstance(“AndroidCAStore”);
如果(ks!=null)
{
ks.load(null,null);
枚举别名=ks.alias();
while(别名.hasMoreElements())
{
字符串别名=(字符串)别名。nextElement();
java.security.cert.X509Certificate cert=(java.security.cert.X509Certificate)ks.getCertificate(别名);
//只打印系统证书
如果(cert.getIssuerDN().getName()包含(“系统”))
{
System.out.println(证书getIssuerDN().getName());
}
//仅打印用户证书
如果(cert.getIssuerDN().getName()包含(“用户”))
{
System.out.println(证书getIssuerDN().getName());
}
//打印所有证书
System.out.println(证书getIssuerDN().getName());
}
}
}捕获(IOE异常){
e、 printStackTrace();
}捕获(KeyStoreException e){
e、 printStackTrace();
}捕获(无算法异常){
e、 printStackTrace();
}捕获(java.security.cert.CertificateException e){
e、 printStackTrace();
}               
}
检查是否已安装证书:
public boolean checkCACertificateInstalled(javax.security.cert.X509CertificateX509){
布尔值IsAcertificateInstalled=false;
尝试
{
字符串名称=x509.getIssuerDN().getName();
KeyStore ks=KeyStore.getInstance(“AndroidCAStore”);
如果(ks!=null)
{
ks.load(null,null);
枚举别名=ks.alias();
while(别名.hasMoreElements())
{
字符串别名=(字符串)别名。nextElement();
java.security.cert.X509Certificate cert=(java.security.cert.X509Certificate)ks.getCertificate(别名);
如果(cert.getIssuerDN().getName()包含(名称))
{
IsAcertificateInstalled=真;
打破
}
}
}
}捕获(IOE异常){
e、 printStackTrace();
}捕获(KeyStoreException e){
e、 printStackTrace();
}捕获(无算法异常){
e、 printStackTrace();
}捕获(java.security.cert.CertificateException e){
e、 printStackTrace();
}
返回已安装证书;
}

谢谢。我还有一个问题。如何在Android上验证给定的X509证书?我可以使用系统上安装的证书或特定于我的应用程序的证书。您必须小心检查是否已安装证书。它取决于
{可分辨名称,序列号}
对,而不仅仅是
可分辨名称
。请参见,例如,关于超级用户。在这个问题上,赛门铁克重新颁发了一个具有相同可分辨名称和相同主题公钥的证书。唯一不同的是序列号(以及从从属CA升级到自签名根CA)。@jww-我们可以添加
cert.getSerialNumber().equals(x509.getSerialNumber())
条件以及
cert.getIssuerDN().getName().contains(name)
检查特定CA的可用性。我认为如果
{DN,SN}
匹配,则返回
true
是合适的。我认为如果只有
{DN}
匹配,则最好发出警告,并可能返回
true
,因为这可能是意外情况,例如重新颁发了证书。通常,“重新颁发的证书”很难追踪,因为它使用的规则很少有人知道。例如,
{DN,SN}
的模糊规则在.Oh中,信不信由你。。。它的
{Issuer DN,SN}
使证书唯一。因此,也许更准确地说,它是三元组
{Issuer DN,SN,Subject DN}
。这是因为证书不存在于真空中——颁发者和主体之间存在关系。事情搞得一团糟。不管怎样,很抱歉让讨论复杂化了……您对比较两个证书之间的指纹(如MD5、SHA)有何看法?那就更准确了。
public void PrintInstalledCertificates( ){

    try 
    {
        KeyStore ks = KeyStore.getInstance("AndroidCAStore");
        if (ks != null) 
        {
            ks.load(null, null);
            Enumeration<String> aliases = ks.aliases();
            while (aliases.hasMoreElements()) 
            {
                String alias = (String) aliases.nextElement();
                java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias);

                //To print System Certs only
                if(cert.getIssuerDN().getName().contains(“system”))
                {
                    System.out.println(cert.getIssuerDN().getName());
                }

                //To print User Certs only 
                if(cert.getIssuerDN().getName().contains(“user”))
                {
                    System.out.println(cert.getIssuerDN().getName());
                }

                //To print all certs
                System.out.println(cert.getIssuerDN().getName());                           
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (java.security.cert.CertificateException e) {
        e.printStackTrace();
    }               
}
public boolean checkCACertificateInstalled(javax.security.cert.X509Certificate x509){

    boolean isCACertificateInstalled = false;

    try 
    {
        String name = x509.getIssuerDN().getName(); 
        KeyStore ks = KeyStore.getInstance("AndroidCAStore");
        if (ks != null) 
        {
            ks.load(null, null);
            Enumeration<String> 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(name)) 
                {
                    isCACertificateInstalled = 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();
    }

    return isCACertificateInstalled;
}