【问题标题】:How to reproduce or solve KeyStoreException?如何重现或解决 KeyStoreException?
【发布时间】:2021-08-11 08:15:35
【问题描述】:

获取下一个描述的崩溃:

java.security.UnrecoverableKeyException引起:获取失败 X.509 形式的公钥 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:263) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:303) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:324) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:388) 在 android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:105) 在 java.security.KeyStore.getKey(KeyStore.java:1062) 在 com.mandarine.sai.sdk.tools.keystore.KeyStoreManager.getKeyPair(KeyStoreManager.java:117) 在 com.mandarine.sai.sdk.tools.keystore.KeyStoreManager.deleteKeyPairs(KeyStoreManager.java:222) 在 com.mandarine.sai.features.authorizations.common.ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:73) 在 com.mandarine.sai.features.authorizations.common.ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:41) 在 com.mandarine.sai.features.authorizations.list.AuthorizationsListViewModel.(AuthorizationsListViewModel.java:79) 在 com.mandarine.sai.app.ViewModelsFactory.create(ViewModelsFactory.java:102)

KeyStoreException:无效的密钥 blob

由 android.security.KeyStoreException 引起:无效的密钥 blob 在 android.security.KeyStore.getKeyStoreException(KeyStore.java:1301) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:265) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:303) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:324) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:388) 在 android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:105) 在 java.security.KeyStore.getKey(KeyStore.java:1062) 在 com.mandarine.sai.sdk.tools.keystore.KeyStoreManager.getKeyPair(KeyStoreManager.java:117) 在 com.mandarine.sai.sdk.tools.keystore.KeyStoreManager.deleteKeyPairs(KeyStoreManager.java:222) 在 com.mandarine.sai.features.authorizations.common.ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:73) 在 com.mandarine.sai.features.authorizations.common.ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:41) 在 com.mandarine.sai.features.authorizations.list.AuthorizationsListViewModel.(AuthorizationsListViewModel.java:79) 在 com.mandarine.sai.app.ViewModelsFactory.create(ViewModelsFactory.java:102) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 在 com.mandarine.sai.features.authorizations.list.AuthorizationsListFragment.setupViewModel(AuthorizationsListFragment.java:119) 在 com.mandarine.sai.features.authorizations.list.AuthorizationsListFragment.onCreate(AuthorizationsListFragment.java:65) 在 androidx.fragment.app.Fragment.performCreate(Fragment.java:2684)

代码如下:

fun collectConnectionsAndKeys(
    repository: ConnectionsRepositoryAbs,
    keyStoreManager: KeyStoreManagerAbs
): Map<ConnectionID, ConnectionAndKey> {
    return repository.getAllActiveConnections().mapNotNull {
        it.getPrivateKeyForConnection(keyStoreManager)
    }.toMap()
}




  /**
     *  Get related private key for connection
     *
     *  @param connection Connection
     *  @return ConnectionAndKey
     */
    override fun createConnectionAndKeyModel(connection: ConnectionAbs): ConnectionAndKey? {
        return getKeyPair(connection.guid)?.private?.let { key ->
            ConnectionAndKey(connection, key)
        }
    }

    /**
     * Get RSA key pair by the given alias
     *
     * @param alias - the alias name
     * @return KeyPair object
     */
    override fun getKeyPair(alias: String?): KeyPair? {
        val keyAlias = alias ?: return null
        val store = androidKeyStore ?: return null
        return (store.getKey(keyAlias, null) as? PrivateKey)?.let { privateKey ->
            val publicKey: PublicKey? = store.getCertificate(keyAlias).publicKey
            KeyPair(publicKey, privateKey)
        }
    }

更新

所以我写了这样的东西:

override fun getKeyPair(alias: String?): KeyPair? {
    return try {
        val keyAlias = alias ?: return null
        val store = androidKeyStore ?: return null
        (store.getKey(keyAlias, null) as? PrivateKey)?.let { privateKey ->
            val publicKey: PublicKey? = store.getCertificate(keyAlias).publicKey
            KeyPair(publicKey, privateKey)
        }
    } catch (e: UnrecoverableKeyException) {
        null
    } catch (e: Exception) {
        Timber.e(e)
        null
    }
}

但我不明白为什么我的 XIAOMI 手机上当前阻止了我的 android 密钥库? herehere 我也看到过类似的问题,但是从密钥库中删除密钥不是我的解决方案。

【问题讨论】:

  • 您是否正在使用您用来写入这些值的相同 APK/Bundle 读取密钥库?
  • @FcoP。我不确定,但我认为是的。这是我的 KeyStoreManager gist.github.com/mnewlive/b7964e86423e68cd02a081d3d3f1d8f3 的完整代码
  • 红米 Note 8 pro 更新到安卓 11 后也出现同样的问题。我找到的唯一解决方案是删除并重新安装应用程序
  • 是的,红米 Note 8 Pro

标签: android kotlin crash crashlytics


【解决方案1】:

尝试输入密码而不是从 ide 自动保存,这是一个已知错误

【讨论】:

  • 对不起,我不明白你的意思。我添加了一些代码,也许它会有用
  • 当您生成签名的 apk 并且 ide 使用您的密钥库的自动保存密码时会发生这种情况,您也是这种情况吗?
  • 当我试图在我的函数getKeyPair中获取存储时发生这种情况@
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 2012-06-26
  • 2018-06-22
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2019-06-28
  • 2020-07-18
相关资源
最近更新 更多