Java 使用SSL证书对PDF文件进行签名

Java 使用SSL证书对PDF文件进行签名,java,itext,keystore,digital-certificate,Java,Itext,Keystore,Digital Certificate,我的应用程序有一个SSL证书,我想使用它使用iText对PDF文件进行数字签名。证书的扩展名为.cer,由证书签名机构(CA)提供 问题是,我无法将此.cer证书转换为java密钥库,这是使用itext库对PDF进行签名时所需的。我拥有的代码是: 此代码显然抛出了无效的密钥库格式IOException。 KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(new FileInputStream("C:\\a

我的应用程序有一个SSL证书,我想使用它使用iText对PDF文件进行数字签名。证书的扩展名为.cer,由证书签名机构(CA)提供

问题是,我无法将此.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文件。

首先,证书不是“SSL证书”。它们是x.509证书,其中一些证书可用于SSL/TLS身份验证。如果您拥有此类证书,则不能将其用于其他目的,包括PDF签名


接下来,.cer文件是证书的公共部分,它不包括私钥。您需要证书和私钥来签署任何内容

首先,证书不是“SSL证书”。它们是x.509证书,其中一些证书可用于SSL/TLS身份验证。如果您拥有此类证书,则不能将其用于其他目的,包括PDF签名



接下来,.cer文件是证书的公共部分,它不包括私钥。您需要证书和私钥来签署任何内容

如何检查我拥有的证书类型。我正在使用apache web服务器(https网站)的.cer证书。私钥是指为从CA获取此.cer证书而生成的.keystore和.csr文件吗?@Ankit Check字段certificate.KeyUsage:数字签名、密钥加密(a0)。ExtendedKeyUsage没有任何内容。如何获取用于签名和证明文档的证书?这些是什么类型的证书?@Ankit您需要检查证书颁发机构网站中的PDF签名证书,它们是这样命名的。我如何检查我拥有的证书类型。我正在使用apache web服务器(https网站)的.cer证书。私钥是指为从CA获取此.cer证书而生成的.keystore和.csr文件吗?@Ankit Check字段certificate.KeyUsage:数字签名、密钥加密(a0)。ExtendedKeyUsage没有任何内容。如何获取用于签名和证明文档的证书?这些是什么类型的证书?@Ankit您需要检查证书颁发机构网站中的PDF签名证书,它们是这样命名的。
abc.cer
是x509证书,但您试图将其作为jks密钥库打开。@user1516873:我知道,这是我的问题,我如何将其转换为jks密钥库?您无法转换它,您可以使用
keytool
命令(来自JRE或JDK)将x509证书添加到密钥库中,但这里没有太多帮助,因为下一行尝试获取
PrivateKey
的操作将因NPE而失败。x509证书不包含并且不能包含私钥。好的,私钥是指为从CA获取此.cer证书而生成的.keystore和.csr文件吗?如果是,我也有。
.csr
-证书申请。这里没有亲戚,算了吧。密钥库-也许这就是你需要的。查看它并使用keytool检查它是否有私钥。类似这样的内容:
keytool-v-list-keystore path_to_keystore.keystore
您应该得到这样的内容:
密钥库类型:JKS密钥库提供程序:SUN您的密钥库包含1个条目别名:sslcert创建日期:2013年3月22日条目类型:privatekeycentry
abc.cer是x509证书,但您试图将其作为jks密钥库打开。@user1516873:我知道,这就是我的问题,我如何将其转换为jks密钥库?您无法转换它,您可以使用
keytool
命令(来自JRE或JDK)将x509证书添加到密钥库中,但这里没有太多帮助,因为下一行,如果您试图获取
PrivateKey
,则NPE将失败。x509证书不包含并且不能包含私钥。好的,私钥是指为从CA获取此.cer证书而生成的.keystore和.csr文件吗?如果是,我也有。
.csr
-证书申请。这里没有亲戚,算了吧。密钥库-也许这就是你需要的。查看它并使用keytool检查它是否有私钥。类似于这样的内容:
keytool-v-list-keystore path_to_keystore.keystore
您应该得到这样的内容:
keystore类型:JKS keystore provider:SUN您的keystore包含1个条目别名:sslcert创建日期:2013年3月22日条目类型:privatekeycentry