没有deleteKey命令从BKS文件丢失密钥

我在我的Android应用程序中使用密钥库(BKS格式)来存储公共私钥对。 该应用程序使用了很长时间,并有10多个公共私钥对。 突然之间,应用程序的主要function之一停止了工作。 发现根本原因如下:

BKS文件中只剩下一个公共私钥对。 所有其他密钥对都丢失了。 我在代码中validation了应用程序中的任何位置都没有调用KeyStore.deleteEntry(别名)。 如果出现问题我唯一能找到的地方如下:

我们创建一个密钥对并使用以下方法设置它:

KeyStore.setKeyEntry(keyId, keyPair.getPrivate(), getKeyStorePassword(), certChain); 

上述方法的javadoc声明如下:如果给定别名已存在,则与给定密钥相关联的密钥库信息将被给定密钥(可能还有证书链)覆盖。

通常,从服务器获取的字符串是UUID,用作别名以在KeyStore中设置新的KeyPair。 因此,新别名与密钥库中已存在的别名相同的可能性非常小。 即使是这种情况,它也只会覆盖一对密钥对。 但是,在这种情况下,大约10个以上的密钥对丢失了。

有没有人知道导致这种密钥对丢失的任何已知问题?

附加信息:

  1. 我发现与每个密钥对的公钥相关联的证书仅在1年内有效。 我认为当在密钥库中设置新密钥对时,可以删除证书过期的密钥对。 但是,当我通过将有效期更改为30天来执行测试用例,并将设备时间更改超过30天时,无法再现该问题。

  2. 还有一件事我不确定它是否与此问题相关:目前生成的所有证书的序列号是BigInteger.ONE:

    X509v1CertificateBuilder certBuilder = new JcaX509v1CertificateBuilder(subject,BigInteger.ONE,notBefore,notAfter,subject,keyPair.getPublic());

我认为这是错误的,但是,我不确定这是否会导致我所遇到的问题。

  1. 以下是设备中出现此问题的安全提供程序列表( 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。