我有一个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);