我目前在使用具有自定义证书类型的Android上使用Keystore时遇到问题。
我目前的情况如下:我想将自定义类型的证书存储在密钥库中。当密钥库已经初始化时,处理此类证书没有问题,但是当我尝试加载包含该证书的.keystore文件时,系统会引发异常,并且无法完成密钥库的初始化。
作为项目的一部分,我必须以专有格式存储证书。为此,我必须实现一个新类(基本上将字节数组拆分为几个字段),该类扩展了Java证书类以用于密钥库。问题在于它们只能在密钥库已经初始化的情况下使用。
这可能是“安全提供程序”问题吗?
这是自定义证书类的预览:
public class KCert extends Certificate{
public KCert(String base64ChainCert) {
super(KCERT_TYPE);
byte[] decodedBytes = Base64.decode(base64ChainCert);
this.KCertType[0] = decodedBytes[0];
this.KCertStructure[0] = decodedBytes[1];
...
}
@Override
public byte[] getEncoded() throws CertificateEncodingException {
byte[] encodedKCert = new byte[384];
ByteBuffer buff = ByteBuffer.wrap(encodedKCert);
buff.put(this.KCertType);
buff.put(this.KCertStructure);
...
return encodedKCert;
}
...
}
(我不知道是否必须实施某些Certificate方法并使其起作用才能使与密钥库的兼容性有效)
然后,我可以在已初始化的密钥库中存储和检索这些新对象,而不会出现问题:
ksm.setCertificateEntry(alias, poCert);
然后:
KCert poCert2 = (KCert) ksm.getCertificate("POCERT");
或类似这样:
Certificate poCert2 = ksm.getCertificate("POCERT");
(“ ksm”代表KeystoreManager,这只是我为轻松操作Keystore对象而开发的界面)
这是抛出给我的异常:
java.io.IOException: java.security.cert.CertificateException: KCert not found
我的问题是:是否可以将具有自定义类型的证书存储在Keystore文件中并在启动应用程序时加载它们?如果是这样,应该采取什么措施使其起作用? (因为密钥库在初始化后似乎可以正确处理这种类型的证书)。
提前谢谢!
---编辑---
小更新:如果我尝试保存包含此类型证书的.bks文件,则该文件似乎已损坏。
我是通过从Android Studio文件资源管理器中检索.bks文件并尝试通过KeyStore Explorer应用程序打开它来发现这一点的。
如果我的密钥库为空,则应用程序可以毫无问题地打开它,但是一旦包含个性化证书,它就变得不可读。
所以我想问题的根源来自保存无效的密钥库?