如图所示,现在我可以实现 1,这是我签名的成功代码,我使用
pdfSigner.signExternalContainer(iExternalSignatureContainer, estimatedSize);
不是
pdfSigner.signDetached();
:
public class PdfSignatureContainerExt implements IExternalSignatureContainer {
private MySignUtil mySignUtil;
public PdfSignatureContainerExt(MySignUtil mySignUtil){
this.mySignUtil= mySignUtil;
}
/**
*
* @param data , the data to sign
* @return a container with the signature and other objects, like CRL and OCSP. The container will generally be a PKCS7 one.
* @throws GeneralSecurityException
*/
@Override
public byte[] sign(InputStream data) throws GeneralSecurityException {
byte[] dataBytes = streamToBytes(data);
return mySignUtil.signP7DetachData(dataBytes);
}
@Override
public void modifySigningDictionary(PdfDictionary signDic) {
signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite);
signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached);
}}
为了实现 2 ,我修改了输出结果无效的代码:
public class PdfSignatureContainerExt implements IExternalSignatureContainer {
private MySignUtil mySignUtil;
public PdfSignatureContainerExt(MySignUtil mySignUtil){
this.mySignUtil= mySignUtil;
}
@Override
public byte[] sign(InputStream data) throws GeneralSecurityException {
byte[] dataBytes = streamToBytes(data);
//change here
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
MessageDigest messageDigest = MessageDigest.getInstance("SHA1" , "BC");
byte[] hash = messageDigest.digest(dataBytes);
return mySignUtil.signP7DetachData(hash);
}
@Override
public void modifySigningDictionary(PdfDictionary signDic) {
signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite);
//change here
signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_sha1);
}}
并且输出符号结果失败,这是我失败的pdf。
用于创建adbe.pkcs7.detached CMS 签名容器的方法
return mySignUtil.signP7DetachData(data);
(带有InputStream data
) 似乎创建容器就像您用来创建adbe.pkcs7.sha1 CMS 容器的方法
return mySignUtil.signP7DetachData(hash);
(带有byte[] hash
),至少这是您的示例文件所建议的。
这是错误的:正如 PDF 参考 1.7 所说:
- adbe.pkcs7.detached:PKCS#7 签名数据字段中未封装任何数据。
- adbe.pkcs7.sha1:字节范围的 SHA1 摘要封装在 PKCS#7 签名数据字段中,ContentInfo 类型为 Data。
(第 8.7.2 节“签名互操作性”)
由于您在这两种情况下都使用了等效的功能来创建 CMS 容器,因此您将adbe.pkcs7.sha1容器中的PKCS#7 签名数据字段(eContent
CMSSignedData
字段中的可选八位字节字符串的EncapsulatedContentInfo
含义)留空,即违反规范。
PS:通常我会参考 ISO 32000 标准,但不幸的是,第 1 部分和第 2 部分中的相应部分已更改,使内容介于更加不清楚和完全错误之间。不幸的是,当人们可以为 ISO 32000-2 进行输入时,我并没有想到这一点。
PPS:Ceterum ceneo adbe.pkcs7.sha1根本不应再使用。我们的验证代码明确没有实现对这些签名的验证。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句