从DER编码的字符串创建X509证书

时间:2012-07-13 05:05:49

标签: cryptography public-key-encryption x509

我有一个X509Certificate,我将其写入/打印到文件中,如下所示。 (我不是在编写编码字节,因为我想阅读证书的内容)

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

后来我想把这个文件(上面)读作String并创建一个新的X509Certificate。

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 个答案:

答案 0 :(得分:3)

简短的回答:你做不到。 DER编码太多无法轻易转换为String的细节。您最好只使用cer.getEncoded()保存DER编码证书,正如GregS在评论中所解释的那样。

如果要查看证书的内容,只需使用操作系统识别的文件扩展名保存,然后双击即可。如果要使用命令行方法打印纯文本信息,请使用例如OpenSSL的:

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

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

答案 1 :(得分:1)

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

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

您可以将两种格式的证书保存到 .cer .crt 扩展名的文件中,并使用标准操作系统证书查看器将其打开。

答案 2 :(得分:0)

可怜的勒芒回答(我会更低级别)

//创建pfx字节流... byte [] selfSigned = CertificateCreator.CreateSelfSignCertificatePfx(distinguishedName,                                                                     新的DateTime(2013年,4,1),                                                                     新的DateTime(2013,12,31),                                                                     insecurePassword);

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

//导出为.cer [DER] selfSigned = cert.Export(X509ContentType.Cert);

//写入文件.. System.IO.File.WriteAllBytes(certificateFilename +“。cer”),selfSigned);

答案 3 :(得分:0)

在Java中你可以做到

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

在.Net

Convert.ToBase64String(Certificate.RawData);