从DER解码的字符串创建X509Certite



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

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

稍后,我想将此文件(如上)作为字符串读取,并创建一个新的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)。请任何人解释如何从未编码的字符串创建X509Certite。

提前谢谢。!

简单的答案是:你不能。DER编码了太多的细节,这些细节无法容易地转换为String。您最好简单地使用cer.getEncoded()保存DER编码的证书,正如GregS在评论中所解释的那样。

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

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

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

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

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

您可以将这两种格式的证书保存到扩展名为.cer.cort的文件中,然后使用standart OS证书查看器打开它。

一个糟糕的男人的答案(我会选择一个更低的级别)

//创建pfx字节流。。。byte[]selfSigned=CertificateCreator.CreateSelfSignCertificatePfx(distinguishedName,新日期时间(2013,4,1),新日期时间(2013,12,31),不安全密码);

//装入证书实例X509Certificate2 cert=新的X509Certification2(自签名,不安全密码);

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

//写入文件。。System.IO.File.WriteAllBytes(certificateFilename+".cer"),自签名);

在Java中,您可以执行

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

In.Net

Convert.ToBase64String(Certificate.RawData);

最新更新