gpt4 book ai didi

java - generateCertificate() 时发生 CertificateException

转载 作者:太空宇宙 更新时间:2023-11-03 13:26:03 26 4
gpt4 key购买 nike

我正在开发我的安卓应用。我正在尝试从我的证​​书文件流生成 X509Certificate 实例,但得到 CertificateException ,这是我的简单代码:

import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
...
public class CertMgr {
//my certification file 'mycert.p12' located in my app internal storage
File certFile = GET_CERT();

X509Certificate cert = null;
try {

FileInputStream fis = new FileInputStream(certFile);
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

if(bis.available() > 0){
//I got CertificateException here, see the stack trace
cert = (X509Certificate) cf.generateCertificate(bis); //line nr 150
}
}catch(...)
{...}
...
}

堆栈跟踪:

javax.security.cert.CertificateException: org.apache.harmony.security.asn1.ASN1Exception: ASN.1 Sequence: mandatory value is missing at [4]
11-11 17:30:20.731: W/System.err(11529): at javax.security.cert.X509Certificate.getInstance(X509Certificate.java:94)
11-11 17:30:20.731: W/System.err(11529): at javax.security.cert.X509Certificate.getInstance(X509Certificate.java:213)
11-11 17:30:20.731: W/System.err(11529): at com.my.app.CertMgr.getCert(CertMgr.java:150)

有人可以向我解释为什么会出现此异常吗?

P.S.:这是我使用的来自 Android SDK 的类 X509Certificate , CertificateFactory

如果你对我为什么这样做感到好奇,原因是我希望我的应用程序能够通过以下代码安装证书(mycert.p12)(如果上面的代码是正常工作):

Intent installIntent = KeyChain.createInstallIntent();

installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, cert.getEncoded());
installIntent.putExtra(KeyChain.EXTRA_NAME, MY_CERT);
startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE);

最佳答案

您正在尝试读取 PKCS#12 数据结构,因为它是 X509 证书。 PKCS#12标准指定了一个数据结构,它可以 bundle 多个证书和私钥,可以选择用密码保护。

为了读取 PKCS#12 数据,您需要使用 KeyStore 加载它.此代码 fragment 显示如何列出 PCKS#12 文件的所有条目:

KeyStore keyStore = KeyStore.getInstance("PKCS12");
File p12File = GET_CERT();
FileInputStream fis = new FileInputStream(p12File);
BufferedInputStream bis = new BufferedInputStream(fis);
keyStore.load(bis, password.toCharArray()); // password is the PKCS#12 password. If there is no password, just pass null
Enumeration<String> aliases = keyStore.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
/* Do something with the keystore entry */
}

KeyStore 条目可以是私钥,有或没有关联的证书链(即从根证书到与私钥对应的证书的证书序列),或受信任的证书。您可以通过 KeyStore.isKeyEntryKeyStore.isCertificateEntry 方法确定条目类型。

根据您提供的 KeyChain Intent ,您似乎想在 key 链中添加一个新的可信根 CA 证书。因此我认为您应该列出 PKCS#12 文件的证书条目。

编辑(2013 年 11 月 12 日)

如何从 keystore 中获取受信任的证书:

String alias = aliases.nextElement();
if (keyStore.isCertificateEntry(alias)) { // keep only trusted cert entries
Certificate caCert = keyStore.getCertificate(alias)
byte[] extraCertificate = caCert.getEncoded();
Intent installIntent = KeyChain.createInstallIntent();
installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, extraCertificate);
installIntent.putExtra(KeyChain.EXTRA_NAME, MY_CERT);
startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE);
}

关于java - generateCertificate() 时发生 CertificateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19910593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com