Java 使用BouncyCastle生成签名文件

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

我有一个PDF文件,我使用此代码签署此文件:

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库。这是一个例子