Cryptography 从DER解码字符串创建X509Certicate

Cryptography 从DER解码字符串创建X509Certicate,cryptography,public-key-encryption,x509,Cryptography,Public Key Encryption,X509,我有一个X509证书,我将其写入/打印到一个文件,如下所示。 (我没有写入编码字节,因为我想读取证书的内容) 稍后,我想将这个文件(上面)作为字符串读取,并创建一个新的X509证书 String cerStr = readCerFromFile(); // Read what is written above. In ASCII/ UTF format ByteArrayInputStream bais = null; try { CertificateFactory cf = Cert

我有一个X509证书,我将其写入/打印到一个文件,如下所示。 (我没有写入编码字节,因为我想读取证书的内容)

稍后,我想将这个文件(上面)作为字符串读取,并创建一个新的X509证书

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


提前谢谢

简单的回答是:你不能。DER编码的细节太多,无法轻松转换为
字符串或从
字符串转换回
。您最好使用
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.crt的文件中,并使用standart OS certificate viewer打开它。

一个糟糕的答案(我的级别非常低)

//创建pfx字节流。。。 字节[]自签名=CertificateCreator.CreateSelfSignCertificateFX(DifferentizedName, 新日期时间(2013年4月1日), 新日期时间(2013年12月31日), 不安全的密码)

//装箱一个证书实例 X509Certificate2证书=新的X509Certificate2(自签名,不安全密码)

//导出为.cer[DER] 自签名=cert.Export(X509ContentType.cert)

//写入文件。。 System.IO.File.writealBytes(certificateFilename+“.cer”),自签名

在Java中,您可以

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

Convert.ToBase64String(Certificate.RawData);

.toString()
没有任何意义。您应该从
cer.getEncoded()
写入编码的字节。使用
X509Certificate.toString
简直是自食其果。所以不要这样做,至少不要保存证书。Thanx GregS。.toString()可以解码和打印DER编码的证书吗?可以目视检查内容。当然,您也可以在Java中创建CLI应用程序。只需读入证书/使用X509 certificate factory对其进行解码并打印出证书大约需要10分钟的工作,但是您需要处理安装、shell脚本创建等。也可以使用Java keytool,它仅在SDK中可用,而不是在运行时。感谢@erickson对这个答案进行拼写检查,我一定是困了。谢谢你的回答
Convert.ToBase64String(Certificate.RawData);