Xades4j - XML Verificação de Assinatura de erro - SignaturePolicyNotAvailableException

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Recebo Fatura XML com Xades EPES assinatura e eu tenho o controle.Então eu tento fazer isso com Xades4j.Eu tenho fixado monte de erro, Mas eu preso no de erro:

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)

Código Java usado para verificar a assinatura :

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

Se necessário, eu possa postar um extrato de tipo de arquivo XML que eu tente verificar após o anonimato.

Obrigado.Eu olhei e tentei tudo o que eu descobri (na net, xades4j exemplo, xades4j junit classe...), mas nada parece resolver o meu erro.

Foi útil?

Solução

Você precisa especificar o seu próprio documento de política provedor de como este: p.withPolicyDocumentProvider().E você tem de implementar o seu próprio fornecedor de políticas que implementa as interfaces SignaturePolicyInfoProvider e SignaturePolicyDocumentProvider.(pelo menos eu fiz desse jeito)

Editar o seu comentário:

Você precisa implementar SignaturePolicyInfoProvider.getSignaturePolicyDocumentStream(), que retorna um InputStream.Este pode ser um FileInputStream

Exemplo:

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
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top