2012-07-13 87 views
2

我有一個X509Certificate,我寫/打印到一個文件如下。 (我不寫編碼的字節,因爲我想讀的證書模板的內容)從DER解碼的字符串創建一個X509Certicate

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

後來我想讀這個文件(以上)的字符串,並創建一個新的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。

在此先感謝。

+4

'的ToString()'沒有任何意義你應該寫的編碼。從'cer.getEncoded()'字節。使用'X509Certificate.toString'只是搬起石頭砸自己的腳。所以,不這樣做,至少不會堅持證書。 – 2012-07-13 21:31:11

+0

感謝名單GregS。是的ToString()OK瞭解碼和打印DER編碼的證書? – Fahim 2012-07-15 04:54:03

+1

它是罰款的內容目視檢查。 – 2012-07-15 12:24:25

回答

3

簡短的回答:你不能。 DER對太多細節進行編碼,這些細節無法輕鬆轉換爲String並從中返回。正如GregS在評論中解釋的,您最好使用cer.getEncoded()保存DER編碼證書。

如果您想查看證書的內容,只需將其保存爲您的操作系統可識別的文件擴展名並雙擊即可。如果你想有一個打印純文本信息的命令行方法,例如openssl:

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

這是在許多Unix版本(Linux,Apple)中包含或可選的標準,也可以在Windows上運行。

+0

您當然也可以在Java內創建一個CLI應用程序。只是讀的CERT /它使用X509出廠合格證和打印出的證書將是約10分鐘的工作進行解碼,但你需要處理的安裝,shell腳本創作等 – 2012-07-15 22:53:07

+0

Java的密鑰工具可能被用來作爲嗯,這是唯一可用但在SDK中,不是運行時。 – 2012-07-15 22:54:43

+0

感謝@erickson拼寫檢查這個答案,我一定很困。 – 2012-08-02 22:22:42

1

以原始數據cert.getEncoded()(在.Net中爲)作爲原始數據時,它以DER格式編碼。非正式地說,它只是證書的一個特殊的二進制表示。

但存在良好的證書字符串表示形式。您可以將DER中的原始證書表示轉換爲Base64格式的字符串。我不知道JAVA,所以在.Net它看起來像這樣Convert.ToBase64dString(cert.RawData)

可以保存兩種格式的證書文件與.CER.CRT推廣和使用非標準OS證書查看器中打開它。

0

一個可憐的男人的答案(我非常較低的水平)

//創建PFX字節流... 的byte []自簽名= CertificateCreator.CreateSelfSignCertificatePfx(distinguishedName來, 新的日期時間(2013年4 ,1), new DateTime(2013,12,31), insecurePassword);

//創建證書實例 X509Certificate2 cert = new X509Certificate2(selfSigned,insecurePassword);

// export as .cer [DER] selfSigned = cert.Export(X509ContentType.Cert);

//寫入文件.. System.IO.File.WriteAllBytes(certificateFilename +「。CER「),自署名);

+0

Thanx David爲答案 – Fahim 2013-04-06 02:09:47

0

在Java中,你可以做

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

在.NET中

Convert.ToBase64String(Certificate.RawData);