不用私钥签署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。
我们没有被要求做任何验证,我知道这是数字签名的最佳和主要思想,我们已经要求有效证书但没有回应。
所以,除此之外是否有意义,有可能吗?
不,这通常是不可能的。
内容上的签名应指明特定的签名者并应针对特定的内容。如果您可以重新分配签名,那么攻击者可以做同样的事情并声称签署了 不同的 文档。
所以有两种可能:
- XML 完全包含要签名并放置在 PDF 文档中的内容(似乎不太可能);
- 签名只是为了保护传输中的XML信息。
后者似乎最有可能。例如网络服务安全(WS-Security)可以使用基于 XML 的签名。
我们被要求做一些我认为不可能的事情。
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。
我们没有被要求做任何验证,我知道这是数字签名的最佳和主要思想,我们已经要求有效证书但没有回应。
所以,除此之外是否有意义,有可能吗?
不,这通常是不可能的。
内容上的签名应指明特定的签名者并应针对特定的内容。如果您可以重新分配签名,那么攻击者可以做同样的事情并声称签署了 不同的 文档。
所以有两种可能:
- XML 完全包含要签名并放置在 PDF 文档中的内容(似乎不太可能);
- 签名只是为了保护传输中的XML信息。
后者似乎最有可能。例如网络服务安全(WS-Security)可以使用基于 XML 的签名。