Android ICS:如何正确选择KeyStore中的自安装用户证书

时间:2012-04-02 15:50:50

标签: android types keystore

我们正在为android开发客户端。首先,用户必须决定使用哪个证书进行连接(ikev2)。有没有一个方法来做到这一点?

所有我发现的是所有已安装证书的循环,如果键入的别名(通过用户输入==非常糟糕)与证书别名“CN = foobar CA,O = foobar,C = CH”匹配,我们接受它,但是你可以想象它的使用年限以及用户必须输入别名的事实是不适用的......

public X509Certificate getCACert(String caName){
    ks = KeyStore.getInstance("AndroidCAStore");
    Enumeration<?> aliases = ks.aliases();
    while (aliases.hasMoreElements()) {
        String alias = (String) aliases.nextElement();
        cert = null;
        try {
            cert = (X509Certificate) ks.getCertificate(alias);
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }

        if (cert.getSubjectDN().getName().equalsIgnoreCase(caName)) {
            break;
        }
    }
return cert;
}

是否可能有用于选择用户证书的预建回调,也许是keystore.getInstance(“type4userCA”)的类型,它只返回没有预安装CA的用户CA,或者有人知道如何以另一种方式过滤它?

我看到android-vpn设置只能在微调器中显示userCA,但是他们使用的是我无法在java.security.keystore上使用的keystore.saw()方法......

THX

1 个答案:

答案 0 :(得分:0)

你想做什么?要连接到VPN等,您需要选择用户的私钥,不确定您是否通过CA证书。您可以使用类似的方式显示选择对话框,并且您的回调将接收所选的别名:

public class KeystoreTest extends Activity implements OnClickListener,
     KeyChainAliasCallback {

    @Override
    public void onClick(View v) {
        KeyChain.choosePrivateKeyAlias(this, this, 
           new String[] { "RSA" }, null, null, -1, null);
    }

    @Override
    public void alias(final String alias) {
        Log.d(TAG, "Thread: " + Thread.currentThread().getName());
        Log.d(TAG, "selected alias: " + alias);
    }
}