我是使用数字签名的新手。在其中一个项目中,我们使用Apache PdfBox来处理数字签名的PDF文件。虽然我们可以测试所有功能,但对已签名的pdf文件的验证是我们无法破解的。我们使用BouncyCastle作为提供者。下面是代码:无法使用Apache PDFBOX验证数字签名
//获取数字签名和签名内容从pdf文件
byte[] signatureAsBytes = pdsignature.getContents(new FileInputStream(this.INPUT_FILE));
byte[] signedContentAsBytes = pdsignature.getSignedContent(new FileInputStream(this.INPUT_FILE));
//数字签名验证
Security.addProvider(new BouncyCastleProvider());
Signature signer = Signature.getInstance("RSA","BC");
//Get PublicKey from p7b file
X509Certificate cert509=null;
File file = new File("C:\\certificate_file.p7b");
FileInputStream fis = new FileInputStream(file);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Collection c = cf.generateCertificates(fis);
Iterator it = c.iterator();
PublicKey pubkey;
while (it.hasNext())
{
cert509 = (X509Certificate) it.next();
pubkey = cert509.getPublicKey();
}
boolean VERIFIED=false;
Security.addProvider(new BouncyCastleProvider());
Signature signer = Signature.getInstance("RSA","BC");
PublicKey key=this.getPublicKey(false);
signer.initVerify(key);
List<PDSignature> allsigs = this.PDFDOC.getSignatureDictionaries();
Iterator<PDSignature> i = allsigs.iterator();
while(i.hasNext())
{
PDSignature sig = (PDSignature) i.next();
byte[] signatureAsBytes = sig.getContents(new FileInputStream(this.INPUT_FILE));
byte[] signedContentAsBytes = sig.getSignedContent(new FileInputStream(this.INPUT_FILE));
signer.update(signedContentAsBytes);
VERIFIED=signer.verify(signatureAsBytes);
}
System.out.println("Verified="+VERIFIED);
下面是P7B格式从证书相关的提取物 - 我使用BouncyCastle作为安全提供商:
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
Key: Sun RSA public key, 2048 bits
Validity: [From: Tue Aug 06 12:26:47 IST 2013,
To: Wed Aug 05 12:26:47 IST 2015]
Algorithm: [SHA256withRSA]
随着a博韦代码我总是得到答案为“假”。我不知道如何解决这个问题。请帮忙
据我所知,需要一份“未签名”版本的pdf文件作为比较。我如何从签名副本中提取PDF文件的原始副本?任何帮助将不胜感激 – Ranjan 2014-09-21 18:48:07
*我如何从签名副本中提取PDF文件的原始副本?* - 这就是'pdsignature.getSignedContent'的用途。 – mkl 2014-09-21 20:01:20
pdsignature.getSignedContent返回原始内容 - 这也是我的理解。但是,验证永远不会返回true。正如我前面所说,我对数字签名不熟悉,因此无法解决问题。 – Ranjan 2014-09-22 08:09:13