2013-04-16 145 views
1

我有我的應用程序的SSL證書,我想用它來使用iText對PDF文件進行數字簽名。證書的擴展名爲.cer,由證書籤名中心(CA)提供。使用SSL證書籤署PDF文件

的問題是,我不能夠轉換這個.cer證書轉換成Java密鑰庫,其在使用iText庫簽署PDF是必需的。我有代碼是:

此代碼顯然引發無效的密鑰庫格式IOException異常。

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(new FileInputStream("C:\\abc.cer"), "abcd".toCharArray()); 
String alias = (String) ks.aliases().nextElement(); 
PrivateKey key = (PrivateKey) ks.getKey(alias, "abcd".toCharArray()); 
java.security.cert.Certificate[] chain = ks.getCertificateChain(alias); 
PdfReader reader = new PdfReader("C:\\test.pdf"); 
FileOutputStream fout = new FileOutputStream("C:\\signed.pdf"); 
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0'); 
PdfSignatureAppearance sap = stp.getSignatureAppearance(); 
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED); 
sap.setReason("Test Reason"); 
sap.setLocation("Test Location"); 
sap.setVisibleSignature(new Rectangle(10, 10, 20, 20), 1, null); 
stp.close(); 

請讓我知道我可以轉換一個SSL證書到Java密鑰存儲和使用它的簽署PDF文件。

+0

'abc.cer'是x509證書,但您試圖將其作爲jks密鑰庫打開。 – user1516873

+0

@ user1516873:我知道,那是我的問題,我如何將它轉換爲jks keystore? – Ankit

+0

您不能轉換它,您可以使用'keytool'命令(來自JRE或JDK)將x509證書添加到密鑰庫中,但在這裏沒有太大幫助,因爲下一行,您嘗試獲取PrivateKey的位置會因NPE而失敗。 x509證書不包含且不能包含私鑰。 – user1516873

回答

4

首先,證書不是「SSL證書」。它們是x.509證書,其中一些可用於SSL/TLS身份驗證。如果您擁有此類證書,則不能將其用於其他目的,包括PDF簽名。

接下來,.CER文件是證書的公共部分,它不包括私鑰。您需要證書私鑰才能簽署任何內容。

+0

我如何檢查證書的類型我有。我正在使用Apache Web服務器(https網站)的.cer證書。通過私鑰,您的意思是.keystore和.csr文件是爲從CA獲取這個.cer證書而生成的嗎? – Ankit

+1

@Ankit檢查證書中字段KeyUsage和ExtendedKeyUsage的字段。 – user1516873

+0

KeyUsage:數字簽名,密鑰加密(a0)。 ExtendedKeyUsage沒有任何內容。 – Ankit