Xades4j - XML de Vérification de Signature d'erreur - SignaturePolicyNotAvailableException
-
21-12-2019 - |
Question
- Je recevoir XML Facture avec Xades NERE signature et j'ai de la contrôler.J'ai donc essayer de le faire avec Xades4j.J'ai corrigé beaucoup d'erreurs, Mais j'ai bloqué sur le message d'erreur:
errxades4j.verification.SignaturePolicyNotAvailableException: Verification failed for property 'SignaturePolicyIdentifier': signature policy document is not available
at xades4j.verification.SignaturePolicyVerifier.verify(SignaturePolicyVerifier.java:67)
at xades4j.verification.SignaturePolicyVerifier.verify(SignaturePolicyVerifier.java:38)
at xades4j.verification.QualifyingPropertiesVerifierImpl.verifyProperties(QualifyingPropertiesVerifierImpl.java:58)
at xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:202)
Code Java pour vérifier la signature :
FileInputStream fis = new FileInputStream("keystore.jks");
KeyStore trustAnchors = KeyStore.getInstance("jks");
trustAnchors.load(fis,"password".toCharArray());
fis.close();
CertificateValidationProvider certValidator = new PKIXCertificateValidationProvider(trustAnchors, false);
XadesVerificationProfile p = new XadesVerificationProfile(certValidator);
XadesVerifier v = p.newVerifier();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
FileInputStream is = new FileInputStream(filename);
Document doc = db.parse(is);
Element sigElem = (Element)doc.getElementsByTagNameNS(Constants.SignatureSpecNS, Constants._TAG_SIGNATURE).item(0);
XAdESVerificationResult r = null;
r = v.verify(sigElem,null);
Si nécessaire, je peux poster un extrait de type de fichier XML j'ai essayer de vérifier après anonymisation.
Merci.J'ai regardé et essayé tout ce que j'ai trouvé (sur le net, xades4j exemple, xades4j junit classe...) mais rien ne semble pouvoir résoudre mon erreur.
La solution
Vous devez spécifier votre propre document de politique de fournisseur comme ceci: p.withPolicyDocumentProvider()
.Et vous devez mettre en place votre propre fournisseur de stratégie qui implémente les interfaces SignaturePolicyInfoProvider
et SignaturePolicyDocumentProvider
.(au moins je l'ai fait de cette façon)
Modifier à votre commentaire:
Vous avez besoin de mettre en œuvre SignaturePolicyInfoProvider.getSignaturePolicyDocumentStream()
, qui renvoie un InputStream
.Cela peut être un FileInputStream
Exemple:
public class FilebasedSignaturePolicyProvider implements SignaturePolicyDocumentProvider {
@Override
public InputStream getSignaturePolicyDocumentStream(ObjectIdentifier sigPolicyId) {
String oid = sigPolicyId.getIdentifier();
try {
return new FileInputStream("directory-to-my-policy-files/" + oid);
} catch (FileNotFoundException e) {
// handle error
}
}
}