如何防止 android 应用程序中的 choosePrivateKeyAlias 对话框?

How to prevent choosePrivateKeyAlias dialog in android app?

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

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

我只想在用户第一次使用该应用程序时显示此 window,但我不知道是否可行。

我看到有关使用 device/owner 配置文件拦截它的信息。这是否意味着它应该在 android 工作?对我来说有点模糊。

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

我错了吗?

感谢您的回答!

我不确定解决此问题的最佳方法,但这是我所做的,对我来说效果很好。

我在首选项中检查了一个布尔变量,如果它returns false,我显示choosePrivateKeyAlias window。如果returns为真,我知道我有权限直接取回证书,就不用弹窗了。

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();
    }
}

希望对您有所帮助...

我使用以下命令检查用户是否已经select编辑了证书:

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") 将 return null,这意味着用户还没有 select 证书。

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