我有一个安卓应用程序,调用一个安全的网站在网络视图。webview检索证书以将其提供给网站。
我必须使用KeyChain.choosePrivateKeyAlias(this, keyChainAliasCallback, null, null, null, -1, CERT_ALIAS);方法,这将显示如下所示的对话框

我希望只在用户第一次使用该应用程序时显示此窗口,但我不知道这是否可行。
我看到了如何使用设备/所有者配置文件截获此内容。这是否意味着它应该在android work上运行?对我来说有点模糊。
另一种解决方案是在第一次检索证书和私钥时将其保存到任何其他应用程序和用户都无法访问的地方。我想到了私有模式下的SharedPreferences。
我说错了吗?
谢谢你的感谢!
发布于 2017-08-28 16:43:09
我不确定解决这个问题的最好方法是什么,但以下是我所做的,对我来说效果很好。
我在preferences中检查了一个布尔变量,如果返回false,则显示choosePrivateKeyAlias窗口。如果返回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();
}
}希望这能帮上忙。
发布于 2020-08-12 06:54:54
我使用以下内容来检查用户是否已经选择了证书:
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,并且在用户删除证书时也不会给出误报。
https://stackoverflow.com/questions/44974349
复制相似问题