android - 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)
解决方案
推荐阅读
- twig - 在页面过滤器中使用数组变量
- compilation - Intel/Altera Quartus:如何强制编译的构建是最新的以避免重新编译?
- java - Android Canvas drawBitmap 在 Android Oreo 上耗时太长,但在 Android Lollipop 上运行良好
- java - 如何使用 TestData 在 javaml 中创建实例?
- javascript - 如何从 for 循环中的回调内部中断
- c - GCC 8 对浮点转换的隐式 int 的无效结果
- curl - 通过中间服务器卷曲
- asp.net-mvc-5 - 由于格式化,DateTime 客户端验证失败
- ruby - 获取datamapper sinatra中的所有模型名称
- javascript - 如何从另一个对象列表中删除对象列表