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

1

Я получаю 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 example, xades4j junit class...), но ничто, кажется, не разрешает мою ошибку.

Теги:
verifyerror
xades4j

1 ответ

3
Лучший ответ

Вам нужно указать свой собственный поставщик документов политики следующим образом: 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
        }
    }
}
  • 0
    Большое спасибо. Да, ваше право на EPES, похоже, нам нужно установить PolicyDocumentProvider. К сожалению, я не понимаю, как настроить свой собственный поставщик политики. Я смотрю на пример xades4j XadesVerifierImplTest ... и я не нашел хорошей документации по этому вопросу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню