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)
استخدام كود جافا للتحقق من التوقيع:
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
}
}
}