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)

استخدام كود جافا للتحقق من التوقيع:

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، فئة xades4j junit...) ولكن يبدو أنه لا يوجد شيء يحل خطأي.

هل كانت مفيدة؟

المحلول

تحتاج إلى تحديد مزود مستند السياسة الخاص بك مثل هذا: 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