6

我有一个 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 )。谁能解释一下如何从未编码的字符串创建 X509Certicate。

提前致谢。!

4

4 回答 4

4

简短的回答:你不能。DER 编码了太多无法轻松转换为String. 您最好使用cer.getEncoded()GregS 在评论中解释的简单保存 DER 编码证书。

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

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

它在许多 Unix 风格(Linux、Apple)中是标准包含或可选的,也可以在 Windows 上运行。

于 2012-07-15T22:48:55.590 回答
1

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

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

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

于 2012-08-02T19:16:16.963 回答
0

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

// 创建 pfx 字节流... byte[] selfSigned = CertificateCreator.CreateSelfSignCertificatePfx(distinguishedName, new DateTime(2013, 4, 1), new 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);

于 2013-04-04T18:37:46.957 回答
0

在Java中你可以做

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

在.Net

Convert.ToBase64String(Certificate.RawData);
于 2016-04-01T17:26:02.247 回答