我有一个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。
提前致谢。
答案 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);