Xades4j - Ошибка проверки подписи XML - SignaturePolicyNotAvailableException

StackOverflow https://stackoverflow.com//questions/25031633

  •  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
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top