2016-05-16 3 views
0

J'ai récemment mis en œuvre la signature numérique et la validation de documents Office à l'aide de la bibliothèque Apache POI. Je cherche maintenant à ajouter une vérification à ceci afin que je puisse prouver que le document a été signé par un utilisateur de confiance. J'ai essayé le code suivant mais sans succès je pense que l'appel à "getSigningCertificateChain" est vide mais je ne suis pas sûr de savoir comment le charger correctement afin que la signature soit là? ceci est mon code actuel:Vérification de la POI Signature numérique

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); 

tout le monde a eu de la chance avec cette implémentation.

+0

Avez-vous essayez de lire [les tests unitaires Apache POI autour des signatures de documents] (http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java?view = balisage)? La [section de cryptage sur le site Web] (http://poi.apache.org/encryption.html) couvre les bases, mais les tests unitaires sont probablement les meilleurs pour tous les détails – Gagravarr

Répondre

0

Vous devez sélectionner le certificat de la chaîne en fonction de l'émetteur Nom commun = {} myCer.cer Nom commun, puis essayez de le vérifier

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

J'espère que cela pourrait aider