Android keystore2.AndroidKeyStoreProvider 在 API 31 的三星设备上引发 NPE

Moh*_*ari 5 android x509certificate key-pair android-keystore

从昨天起,我收到了运行 Android 12 的三星设备上的大量崩溃报告。AndroidKeyStoreProvider 在调用 X509Certificate.getPublicKey() 时抛出 NPE。它在其他品牌的设备上运行良好。

密钥对生成方法:

   public void generateKeys(Context context) throws GeneratePairKeyException {
    KeyPairGenerator keyPairGenerator;
    try {
        if(KeyStoreUtil.getPrivateKey() == null){
            Calendar start = GregorianCalendar.getInstance();
            Calendar end = GregorianCalendar.getInstance();
            end.add(Calendar.YEAR, 10);
            keyPairGenerator = KeyPairGenerator.getInstance("RSA", ANDROID_KEY_STORE);
            keyPairGenerator.initialize(new KeyPairGeneratorSpec.Builder(context)
                    .setAlias(ALIAS)
                    .setSerialNumber(BigInteger.valueOf(1))
                    .setStartDate(start.getTime())
                    .setEndDate(end.getTime())
                    .setSubject(new X500Principal("CN=Pushe_CA"))
                    .build());
            keyPairGenerator.generateKeyPair();
        }
    } catch (NoSuchAlgorithmException |
            NoSuchProviderException | InvalidAlgorithmParameterException e) {
        Logger.e(e);
        throw new GeneratePairKeyException("pair key not created");
    } catch (IllegalStateException e) {
        throw e;
    } catch (Exception e) {
        throw new GeneratePairKeyException("pair key not created");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试获取这样的私钥时,应用程序崩溃了:

 KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
 keyStore.load(null);
 (PrivateKey) keyStore.getKey(ALIAS, null);
Run Code Online (Sandbox Code Playgroud)

这是崩溃日志:

致命异常:java.lang.NullPointerException:尝试在 android.security.keystore2.AndroidKeyStoreProvider.makeAndroidKeyStorePublicKeyFromKeyEntryResponse(AndroidKeyStoreProvider. java:220) 在 android.security.keystore2.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:401) 在 android.security.keystore2.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:343) 在 android.security.keystore2.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi .java:110) 在 java.security.KeyStore.getKey(KeyStore.java:1062)

有什么解决办法吗?