2013-04-16 142 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