获取私钥时链为空

56

我正在使用存储在Android密钥库中的RSA密钥对来加密我的应用程序中的数据。

我在Play商店看到了NullPointerException,但是我无法复制它们:

java.lang.NullPointerException: chain == null
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:1205)
    at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:374)
    at java.security.KeyStore.getEntry(KeyStore.java:644)
    at MyClass.getKeyStoreEntry(MyClass.java:111)
创建密钥对的源代码
Calendar start = Calendar.getInstance();
start.setTimeInMillis(0);
Calendar end = Calendar.getInstance();
end.set(Calendar.YEAR, 3000);

KeyPairGeneratorSpec.Builder keySpecBuilder = new KeyPairGeneratorSpec.Builder(context)
    .setAlias(keyName)
    .setSubject(new X500Principal("CN=" + keyName))
    .setSerialNumber(BigInteger.TEN)
    .setStartDate(start.getTime())
    .setEndDate(end.getTime())
    .setKeySize(RSA_KEY_SIZE);

KeyPairGeneratorSpec spec = keySpecBuilder.build();
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
gen.initialize(spec);
gen.generateKeyPair();

接着来检索密钥:

private KeyStore.PrivateKeyEntry getKeyStoreEntry() {
    KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
    keyStore.load(null);

    if (!keyStore.containsAlias(keyName)) {
        throw new KeyNotFoundException();
    }
    return (KeyStore.PrivateKeyEntry) keyStore.getEntry(keyName, null);
}

只有在API 19-22上使用KeyPairGeneratorSpec时才会发生这种情况。23+实现可以正常工作。

没有另一个同名的密钥,也没有删除该密钥


1
@RED_ 不,如果它失败了,我最终回退到旧的实现。 - AesSedai101
1
你曾经解决过这个问题吗?我也遇到了同样的问题,感觉很沮丧! - Abushawish
没有,我绕过了这个问题。 - AesSedai101
2个回答

2

我在那个地方加入了解决方法(如果密钥库中不存在该密钥,则重新创建它),所以这不幸不是问题的原因。 - AesSedai101

1
请直接使用KeyStore的getKey方法。
private java.security.Key getSecretKey(Context context) throws Exception {
  return keyStore.getKey(XEALTH_KEY_ALIAS, null);
}

这是一个RSA密钥对,不幸的是它不是一个秘密密钥。 - AesSedai101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接