2012-07-13 82 views
2

我有一个X509Certificate,我写/打印到一个文件如下。 (我不写编码的字节,因为我想读的证书模板的内容)从DER解码的字符串创建一个X509Certicate

X509Certificate cer = generateCertificate(); // cer is DER encoded 
writeToFile(cer.toString()); // cer.toString() converts DER to UTF/ASCII??? 

后来我想读这个文件(以上)的字符串,并创建一个新的X509证书。

String cerStr = readCerFromFile(); // Read what is written above. In ASCII/ UTF format 
ByteArrayInputStream bais = null; 
try { 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    bais = new ByteArrayInputStream(cerStr.getBytes()); 
    return (X509Certificate) cf.generateCertificate(bais); 
} ... 

这会抛出以下异常。

Java.security.cert.CertificateParsingException: Invalid DER-encoded certificate data 

很明显,我没有将cerStr转换为DER格式(我不知道是否可以转换为DER)。任何人都可以解释如何从未编码的字符串创建X509Certicate。

在此先感谢。

+4

'的ToString()'没有任何意义你应该写的编码。从'cer.getEncoded()'字节。使用'X509Certificate.toString'只是搬起石头砸自己的脚。所以,不这样做,至少不会坚持证书。 – 2012-07-13 21:31:11

+0

感谢名单GregS。是的ToString()OK了解码和打印DER编码的证书? – Fahim 2012-07-15 04:54:03

+1

它是罚款的内容目视检查。 – 2012-07-15 12:24:25

回答

3

简短的回答:你不能。 DER对太多细节进行编码,这些细节无法轻松转换为String并从中返回。正如GregS在评论中解释的,您最好使用cer.getEncoded()保存DER编码证书。

如果您想查看证书的内容,只需将其保存为您的操作系统可识别的文件扩展名并双击即可。如果你想有一个打印纯文本信息的命令行方法,例如openssl:

openssl x509 -text -noout -inform DER -in mycertificate.crt 

这是在许多Unix版本(Linux,Apple)中包含或可选的标准,也可以在Windows上运行。

+0

您当然也可以在Java内创建一个CLI应用程序。只是读的CERT /它使用X509出厂合格证和打印出的证书将是约10分钟的工作进行解码,但你需要处理的安装,shell脚本创作等 – 2012-07-15 22:53:07

+0

Java的密钥工具可能被用来作为嗯,这是唯一可用但在SDK中,不是运行时。 – 2012-07-15 22:54:43

+0

感谢@erickson拼写检查这个答案,我一定很困。 – 2012-08-02 22:22:42

1

以原始数据cert.getEncoded()(在.Net中为)作为原始数据时,它以DER格式编码。非正式地说,它只是证书的一个特殊的二进制表示。

但存在良好的证书字符串表示形式。您可以将DER中的原始证书表示转换为Base64格式的字符串。我不知道JAVA,所以在.Net它看起来像这样Convert.ToBase64dString(cert.RawData)

可以保存两种格式的证书文件与.CER.CRT推广和使用非标准OS证书查看器中打开它。

0

一个可怜的男人的答案(我非常较低的水平)

//创建PFX字节流... 的byte []自签名= CertificateCreator.CreateSelfSignCertificatePfx(distinguishedName来, 新的日期时间(2013年4 ,1), new DateTime(2013,12,31), insecurePassword);

//创建证书实例 X509Certificate2 cert = new X509Certificate2(selfSigned,insecurePassword);

// export as .cer [DER] selfSigned = cert.Export(X509ContentType.Cert);

//写入文件.. System.IO.File.WriteAllBytes(certificateFilename +“。CER“),自署名);

+0

Thanx David为答案 – Fahim 2013-04-06 02:09:47

0

在Java中,你可以做

String sCert = javax.xml.bind.DatatypeConverter.printBase64Binary(certificate.getEncoded()); 

在.NET中

Convert.ToBase64String(Certificate.RawData);