Android应用使用Cognito接入Amazon DynamoDB出现Keystore Exception如何解决
报错原因
这个报错是AWS Android SDK的本地密钥存储模块抛出的异常,根因有三类:
- Android系统KeyStore中存储的AWS加密密钥条目
com.amazonaws.android.auth.aesKeyStoreAlias已损坏,或是SDK没有足够权限操作该条目,导致SDK尝试删除旧密钥的操作失败 - 你使用的AWS Android SDK版本存在已知兼容性bug,2.16.x~2.22.x区间的部分版本在Android 10及以上系统上大概率会触发这个KeyStore操作异常
- 应用上次运行过程中,密钥写入操作被强行中断,导致KeyStore中的对应密钥条目处于不可读写的异常状态
解决方案
你可以根据你的业务场景选择以下任意一种方案解决:
方案1:升级AWS Android SDK版本
这是最彻底的解决办法,AWS官方已经在2.23.0及之后的稳定版本修复了该KeyStore操作的兼容性问题,直接把项目中AWS相关依赖的版本升级到最新稳定版即可。
方案2:初始化前手动清除损坏的密钥条目
在初始化CognitoCachingCredentialsProvider之前,加入以下代码手动清除旧的损坏密钥:
try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); String keyAlias = "com.amazonaws.android.auth.aesKeyStoreAlias"; if (keyStore.containsAlias(keyAlias)) { keyStore.deleteEntry(keyAlias); } } catch (Exception e) { e.printStackTrace(); }
方案3:替换为非缓存的凭证提供器
如果你不需要本地缓存Cognito的身份凭证,可以直接把CognitoCachingCredentialsProvider替换为CognitoCredentialsProvider,不会触发本地密钥存储的逻辑,自然不会出现该报错。
方案4:临时清除应用数据
如果是测试阶段偶发的报错,可以直接到系统设置的应用管理页,找到你的应用,执行清除存储数据的操作,即可删除损坏的密钥条目解决问题,该方案为临时方案,SDK版本不升级的话可能后续还会复现。
另外注意你现有代码的逻辑漏洞:如果CognitoCachingCredentialsProvider初始化抛出异常,credentialsProvider会为null,后续传给AmazonDynamoDBClient会引发空指针异常,建议在初始化DynamoDB客户端之前增加空值判断。
内容的提问来源于stack exchange,提问作者Midhun PM
相关产品推荐
相关产品推荐

