首页 > 解决方案 > Android KeyStore setKeyEnty 在 String.length 上抛出 NPE

问题描述

我在KeyStore使用客户端证书创建身份验证时遇到问题。正如您所看到的来自 BounceCastle 的异常,所以我无法调试BcKeyStoreSpi.engineSetKeyEntry. 我不知道什么 String 是空的。我所有的参数都被填满了,看起来是正确的。我的解决方案有什么问题?

我能够在多个设备(Android 9、8.1、7.0)上重现这一点。此外,我已经尝试禁用 proguard,但它仍然在抛出 NPE。甚至多个证书。

代码

String certAlias = "alias";
PrivateKey privateKey = KeyChain.getPrivateKey(context, certAlias);
X509Certificate[] certChain = KeyChain.getCertificateChain(context, certAlias);
X509Certificate mdmCert = certChain[0];

char[] password = "password".toCharArray();
String alis = "private";
HeldCertificate heldCertificate = new HeldCertificate(
        new KeyPair(
                mdmCert.getPublicKey(),
                privateKey
        ),
        mdmCert
);
X509Certificate[] certificates = new X509Certificate[certChain.length + 1];
certificates[0] = heldCertificate.certificate();
System.arraycopy(certChain, 0, certificates, 1, certChain.length);


KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, password);
ks.setKeyEntry(             //this is the problematic part
        alis,
        heldCertificate.keyPair().getPrivate(),
        password,
        certificates

);

堆栈跟踪

java.security.KeyStoreException: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.leng
    at com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi.engineSetKeyEntry(BcKeyStoreSpi.java:685)
    at java.security.KeyStore.setKeyEntry(KeyStore.java:1179)
    at cz.kctdata.skoenergo.ui.activity.MainActivity$GetCertAsyncTask.doInBackground(MainActivity.java:153)
    at cz.kctdata.skoenergo.ui.activity.MainActivity$GetCertAsyncTask.doInBackground(MainActivity.java:86)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)

标签: androidbouncycastlekeystore

解决方案


推荐阅读