检索私钥时链为空

Posted

技术标签:

【中文标题】检索私钥时链为空【英文标题】:Chain is null when retrieving private key 【发布时间】:2016-12-31 09:13:53 【问题描述】:

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

我在 Play 商店中看到了 NullPointerExceptions,但我无法重现它们:

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+ 的实现工作正常。

我有do not have another key with the same name,我也没有deleted the key。

【问题讨论】:

@RED_ no - 如果失败,我最终会退回到旧的实现 你曾经解决过这个问题吗?遇到同样的问题,令人沮丧! 不,我解决了这个问题 【参考方案1】:

我相信您只是面对 Keystore 错误。例如,请参阅这篇文章:Android Security: The Forgetful Keystore。 Android 跟踪器中也有大量与密钥库相关的错误报告,例如AndroidKeyStore deleted after changing screen lock type。

【讨论】:

我为那个地方设置了解决方法(如果密钥库中不存在我重新创建它的密钥),所以很遗憾这不是问题【参考方案2】:

请直接使用KeyStore的getKey方法

private java.security.Key getSecretKey(Context context) throws Exception 
  return keyStore.getKey(XEALTH_KEY_ALIAS, null);

【讨论】:

这是一个 RSA 密钥对,不幸的是不是密钥

以上是关于检索私钥时链为空的主要内容,如果未能解决你的问题,请参考以下文章

linux字符测试

当我尝试从密钥容器访问私钥时引发异常

使用脚本选项及组合条件测试

PHPActiveRecord validates

java判断字符串是不是为空

php判断mysql数据库是不是为空