使用自定义证书类型加载Android Keystore时出现问题

时间:2019-07-16 07:23:55

标签: java certificate android-keystore

我目前在使用具有自定义证书类型的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应用程序打开它来发现这一点的。

如果我的密钥库为空,则应用程序可以毫无问题地打开它,但是一旦包含个性化证书,它就变得不可读。

所以我想问题的根源来自保存无效的密钥库?

0 个答案:

没有答案