不用私钥签署pdf

Sign pdf without private key

我们被要求做一些我认为不可能的事情。

Web 服务 return base64 字符串签名(不是证书或私钥)。

我们被要求使用该签名签署 pdf。

是否可以用它签署 pdf 文件?我们不太了解数字签名的理论,每次我们需要做这样的事情时,我们都有一个私钥和一个有效的证书,所以我们不知道这是否可能(也不知道是否有道理)。

这是我们的代码,我们不知道字符串签名如何适合这里。

    public void sign(ByteArrayInputStream document, OutputStream os, String digestAlgorithm, String provider, CryptoStandard subfilter, String reason, String location) throws GeneralSecurityException, IOException, DocumentException {

        PdfReader reader = new PdfReader(document);
        PdfStamper stamper = PdfStamper.createSignature(reader, os, '[=10=]');
        PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
        appearance.setReason(reason);
        appearance.setLocation(location);
        appearance.setSignatureCreator(provider);
        appearance.setVisibleSignature(new Rectangle(0, 0, 100, 780), 1, "sig");
        ExternalDigest digest = new BouncyCastleDigest();
        List<Certificate> listCert = new ArrayList<Certificate>();
        listCert.add(this.getCertificate());
        Certificate[] chain = new Certificate[listCert.size()];
        chain = listCert.toArray(chain);
        ExternalSignatureContainer cont = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
        cont.sign(document);
        MakeSignature.signExternalContainer(appearance, cont, 50);
    }

我更新答案以回应 Xavier。

我们没有被要求做任何验证,我知道这是数字签名的最佳和主要思想,我们已经要求有效证书但没有回应。

所以,除此之外是否有意义,有可能吗?

不,这通常是不可能的。

内容上的签名应指明特定的签名者并应针对特定的内容。如果您可以重新分配签名,那么攻击者可以做同样的事情并声称签署了 不同的 文档。

所以有两种可能:

  1. XML 完全包含要签名并放置在 PDF 文档中的内容(似乎不太可能);
  2. 签名只是为了保护传输中的XML信息。

后者似乎最有可能。例如网络服务安全(WS-Security)可以使用基于 XML 的签名。