如何将证书信息与已签名的数据相关联?

时间:2017-12-15 10:06:29

标签: java digital-signature x509certificate bouncycastle pdfbox

我正在尝试使用pdf-box库(v2.0.8)将数字签名添加到pdf文档中。我从Web服务接收已签名的内容(仅使用私钥签名)。现在,我需要将证书信息与此签名数据相关联,以便将其添加到PDF文档中。我们如何为已经签名的内容添加证书,最好使用充气城堡api?

// here content is data which has to be signed
public byte[] sign(InputStream content) throws IOException {
        try {
            CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
            List<Certificate> certList = new ArrayList<Certificate>();
            certList.add(certificate);
            Store certs = new JcaCertStore(certList);
            gen.addCertificates(certs);

            CMSProcessableInputStream msg = new CMSProcessableInputStream(signPrivate(content));
            CMSSignedData signedData = gen.generate(msg, false);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DEROutputStream dos = new DEROutputStream(baos);
            dos.writeObject(signedData.toASN1Structure());
            return baos.toByteArray();
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

在这里,我可以生成数字签名,但它不包含任何证书信息。我已经检查了thisthis问题,但他们没有采用单独使用私钥签名内容的情况,只需要关联证书。

1 个答案:

答案 0 :(得分:1)

(您发布的代码是指CMS签名容器,因此我假设我们正在讨论 adbe.pkcs7.detached ETSI.CAdES.detached PDF签名。)

在CMS签名容器中创建签名时,可以选择签名值是否仅签署文档数据的(散列),或者是否签署了所谓的签名属性的集合signedAttrs规范中的SignerInfo)和文档数据的哈希值只是其中一个属性的值。

  SignerInfo ::= SEQUENCE {
    version CMSVersion,
    sid SignerIdentifier,
    digestAlgorithm DigestAlgorithmIdentifier,
    signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
    signatureAlgorithm SignatureAlgorithmIdentifier,
    signature SignatureValue,
    unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }

RFC 5652 section 5.3. SignerInfo Type

但是,要认真对待所有配置文件,要求您使用签名属性,特别是它们要求您使用ESS签名证书(RFC 2634 section 5.4)或ESS签名证书-v2 {{3签名属性以引用签署者证书。

因此,在这些属性中,在生成签名值之前,签名与其签名证书的关联是固定的

因此,您无法将签名证书与已生成的签名自由关联。