2010-08-02 64 views

回答

58

当然。

证书对象可以由CertificateFactory的实例创建 - 特别是配置为创建X509证书的实例。这可以像这样创建:

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

然后,你需要通过它包含证书的字节的InputStream。你的答案

InputStream in = new ByteArrayInputStream(bytes); 
X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in); 
+0

感谢:这可以通过包装你的字节数组在ByteArrayInputStream来实现。但是我在最后一行得到了“(java.security.cert.CertificateException)java.security.cert.CertificateException:无法解析证书:java.io.IOException:空输入”。 InputStream不是空的,但它抛出异常 – 0bj3ct 2015-06-12 07:22:17

+1

同样的事情发生在我身上,因为我没有仔细考虑我在做什么。就我而言,这是因为我试图用keystore中的字节而不是密钥库中的证书来完成上述操作。从密钥库中提取证书,获取编码字节,然后处理这些是上面这个答案为我工作的原因。 – 2015-11-13 22:12:14

+2

在我的情况下,问题是byte []是基于64编码...错误消息是有点误导性的“空输入”。也许它可以帮助某人... – riskop 2016-06-09 15:17:39

-1
InputStream stream = null; 
byte[] bencoded = javax.xml.bind.DatatypeConverter.parseBase64Binary(x509CertificateStr); 

try { 
    CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
    cert = (X509Certificate) certFactory.generateCertificate(stream); 

} catch (java.security.cert.CertificateException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
+0

这个问题没有提到base-64,并且'stream'的初始化丢失了。这段代码会抛出一个'NullPointerException'。 – EJP 2016-03-23 11:51:05