Java 使用BouncyCastle生成签名文件
我有一个PDF文件,我使用此代码签署此文件:Java 使用BouncyCastle生成签名文件,java,bouncycastle,Java,Bouncycastle,我有一个PDF文件,我使用此代码签署此文件: certificate = (X509Certificate) loadKeyStore(certificateFile, password).getCertificate(alias); privateKey = (PrivateKey) loadKeyStore(certificateFile, password).getKey(alias, alias.toCharArray()); Security.addProvider(n
certificate = (X509Certificate) loadKeyStore(certificateFile, password).getCertificate(alias);
privateKey = (PrivateKey) loadKeyStore(certificateFile, password).getKey(alias, alias.toCharArray());
Security.addProvider(new BouncyCastleProvider());
BufferedInputStream inFile = new BufferedInputStream(new FileInputStream(origem));
byte[] dates = new byte[inFile.available()];
entrada.read(dates);
entrada.close();
CMSSignedDataGenerator genetateSign = new CMSSignedDataGenerator();
geradorAss.addSigner(privateKey, certificate, CMSSignedDataGenerator.DIGEST_SHA1);
List certList = new ArrayList();
certList.add(certificate);
CertStore certs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(certList));
geradorAss.addCertificatesAndCRLs(certs);
// Efetivamente assinar os dados de entrada
CMSProcessable content = new CMSProcessableByteArray(dates);
String providerName;
if (ks.getType().equalsIgnoreCase("JKS")) {
providerName = BouncyCastleProvider.PROVIDER_NAME;
} else {
providerName = ks.getProvider().getName();
}
CMSSignedData signedDate = genetateSign.generate(content, providerName);
signedDate = new CMSSignedData(content, signedDate.getEncoded());
File f = Converter.converter("signedFile.pdf", signedDate.getEncoded());
但是,文件f不能在读卡器上打开。当我获取文件f并运行以下代码时:
CMSSignedData data = new CMSSignedData(new FileInputStream(f));
出现以下错误:
org.bouncycastle.cms.CMSException: Malformed content.
有人能帮我吗
总结:
我需要在签名后生成最终文件。例如,我有一个test.pdf文件,我想签名并生成test_signed.pdf文件。这个test_signed.pdf文件必须有签名,并且在您的阅读器中仍然可以阅读
我在等…PDF在文档中嵌入了签名,而CMS本身就是签名。要从PDF中提取和验证签名,请使用iText库。这是一个例子