如何在Android应用程序中阻止choosePrivateKeyAlias对话框?

时间:2017-07-07 15:18:11

标签: android keychain

我有一个Android应用程序,可以在webview中调用安全网站。 webview检索证书以将其提供给网站。

我必须使用KeyChain.choosePrivateKeyAlias(this, keyChainAliasCallback, null, null, null, -1, CERT_ALIAS);方法,这会显示一个像这样的对话框

certificate select

我只想在用户第一次使用该应用时显示此窗口,但我不知道是否可能。

我看到了使用设备/所有者个人资料拦截此内容。这是否意味着它应该在Android上工作?这对我来说有点模糊。

另一个解决方案是保存证书和私钥,这是第一次在任何其他应用程序和用户都无法访问的地方进行检索。我想到私有模式下的SharedPreferences。

我错了吗?

谢谢你的回答!

2 个答案:

答案 0 :(得分:3)

我不确定解决这个问题的好方法,但这就是我所做的对我来说没问题。

我在首选项中检查了一个布尔变量,如果返回false,则显示choosPrivateKeyAlias窗口。 如果返回true,我知道我有权直接检索证书,因此无需显示弹出窗口。

boolean isGranted = prefs.getBoolean("MY_CERT", false);
if(!isGranted) {
        //Get cert and private key from internal android store
        KeyChainAliasCallback keyChainAliasCallback = new KeyChainAliasCallback() {
            @Override
            public void alias(@Nullable String s) {
                Log.d(TAG, "selected alias = " + s);
                SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
                editor.putBoolean("MY_CERT", true);
                editor.commit();
                retriveCertsTask.execute();
            }
        };
        KeyChain.choosePrivateKeyAlias(mActivity, keyChainAliasCallback, null, null, null, -1, CERT_ALIAS);
    } else {
        // Retrieve certs an private key
        retriveCertsTask.execute();
    }

希望它有所帮助...

答案 1 :(得分:1)

我使用以下命令来检查用户是否已经选择了证书:

activity?.let { it1 ->
    var selectedPrivateKey = KeyChain.getPrivateKey(it1, "keystore-test")
    if (selectedPrivateKey == null) { // if we can't access the private key then prompt for cert selection
        KeyChain.choosePrivateKeyAlias(it1, {
            Log.d("App", "Popped up KeyChain selection screen")
        }, null, null, null, "keystore-test") // this is the alias that is chosen in the popup by default
    }
}
如果您无权访问私钥,则

KeyChain.getPrivateKey(it1, "keystore-test")将返回null,这意味着用户尚未选择证书。

此实现将使您不必使用SharedPreferences,并且如果用户删除证书,也不会给您带来误报。