2016-05-16 56 views
0

我最近使用apache POI库实现了办公文档的数字签名和验证。我现在正在考虑为此添加验证,以便证明文档由可信用户签名。我已经尝试了下面的代码,但没有成功我认为作为“getSigningCertificateChain”的调用是空的,但我不知道如何得到这个加载正确,所以签名将在那里?这是我现在的代码:验证POI数字签名

pkg = OPCPackage.open(Dir, PackageAccess.READ); 

    sic = new SignatureConfig(); 
    sic.setOpcPackage(pkg); 
    SignatureInfo si = new SignatureInfo(); 
    si.setSignatureConfig(sic); 
    isValid = si.verifySignature(); 

    X509Certificate x509a = (X509Certificate) sic.getSigningCertificateChain().get(0); 


    FileInputStream fin = new FileInputStream("C:\myCer.cer"); 
    CertificateFactory f = CertificateFactory.getInstance("X.509"); 
    X509Certificate certificate = (X509Certificate)f.generateCertificate(fin); 
    PublicKey pk = certificate.getPublicKey(); 
    x509a.verify(pk); 

任何人都有执行此操作的运气。

+0

你有没有尝试阅读[围绕文档签名的Apache POI单元测试](http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java?view =标记)? [网站上的加密部分](http://poi.apache.org/encryption.html)涵盖了基本知识,但单元测试可能是最全面的细节 – Gagravarr

回答

0

您必须选择从链根据发行通用名称= {} myCer.cer通用名称的证书,然后尝试验证它

PublicKey pk = selectedIssuedCertificate.getPublicKey(); 
x509a.verify(pk); 

我希望这能帮助