没有deleteKey命令从BKS文件丢失密钥
我在我的Android应用程序中使用密钥库(BKS格式)来存储公共私钥对。 该应用程序使用了很长时间,并有10多个公共私钥对。 突然之间,应用程序的主要function之一停止了工作。 发现根本原因如下:
BKS文件中只剩下一个公共私钥对。 所有其他密钥对都丢失了。 我在代码中validation了应用程序中的任何位置都没有调用KeyStore.deleteEntry(别名)。 如果出现问题我唯一能找到的地方如下:
我们创建一个密钥对并使用以下方法设置它:
KeyStore.setKeyEntry(keyId, keyPair.getPrivate(), getKeyStorePassword(), certChain);
上述方法的javadoc声明如下:如果给定别名已存在,则与给定密钥相关联的密钥库信息将被给定密钥(可能还有证书链)覆盖。
通常,从服务器获取的字符串是UUID,用作别名以在KeyStore中设置新的KeyPair。 因此,新别名与密钥库中已存在的别名相同的可能性非常小。 即使是这种情况,它也只会覆盖一对密钥对。 但是,在这种情况下,大约10个以上的密钥对丢失了。
有没有人知道导致这种密钥对丢失的任何已知问题?
附加信息:
-
我发现与每个密钥对的公钥相关联的证书仅在1年内有效。 我认为当在密钥库中设置新密钥对时,可以删除证书过期的密钥对。 但是,当我通过将有效期更改为30天来执行测试用例,并将设备时间更改超过30天时,无法再现该问题。
-
还有一件事我不确定它是否与此问题相关:目前生成的所有证书的序列号是BigInteger.ONE:
X509v1CertificateBuilder certBuilder = new JcaX509v1CertificateBuilder(subject,BigInteger.ONE,notBefore,notAfter,subject,keyPair.getPublic());
我认为这是错误的,但是,我不确定这是否会导致我所遇到的问题。
-
以下是设备中出现此问题的安全提供程序列表(
Security.getProviders()
):- AndroidKeyStoreBCWorkaround版本1.0
- AndroidOpenSSL版本1.0
- BC版本1.52
- 加密版1.0
- HarmonyJSSE 1.0版
- AndroidKeyStore版本1.0
因此,所有Java加密操作都是使用AndroidKeyStoreBCWorkaround版本1.0完成的。 该设备是Nexus 5,Android 6.0.1。