Xades4j - Ошибка проверки подписи XML - SignaturePolicyNotAvailableException
-
21-12-2019 - |
Вопрос
Я получаю XML-счет-фактуру с подписью Xades EPES, и я должен контролировать его.Поэтому я пытаюсь сделать это с помощью Xades4j.Я исправил много ошибок, Но я застрял на этой ошибке:
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)
Использование кода Java для проверки подписи :
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);
При необходимости я могу опубликовать выдержку из XML-файла, который я пытаюсь проверить после анонимизации.
Спасибо.Я просмотрел и перепробовал все, что нашел (в сети, например, xades4j, класс junit xades4j ...), но, похоже, ничто не устраняет мою ошибку.
Решение
Вам необходимо указать своего собственного поставщика документов политики следующим образом: p.withPolicyDocumentProvider()
.И вы должны реализовать свой собственный поставщик политики, который реализует интерфейсы SignaturePolicyInfoProvider
и SignaturePolicyDocumentProvider
.(по крайней мере, я сделал это именно так)
Отредактируйте свой комментарий:
Вам необходимо реализовать SignaturePolicyInfoProvider.getSignaturePolicyDocumentStream()
, который возвращает InputStream
.Это может быть FileInputStream
Пример:
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
}
}
}