我有一个Android应用程序,可以在webview中调用安全网站。 webview检索证书以将其提供给网站。
我必须使用KeyChain.choosePrivateKeyAlias(this, keyChainAliasCallback, null, null, null, -1, CERT_ALIAS);
方法,这会显示一个像这样的对话框
我只想在用户第一次使用该应用时显示此窗口,但我不知道是否可能。
我看到了使用设备/所有者个人资料拦截此内容。这是否意味着它应该在Android上工作?这对我来说有点模糊。
另一个解决方案是保存证书和私钥,这是第一次在任何其他应用程序和用户都无法访问的地方进行检索。我想到私有模式下的SharedPreferences。
我错了吗?
谢谢你的回答!
答案 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,并且如果用户删除证书,也不会给您带来误报。