Проверка подписи XADES с помощью XADES4j

Мы хотели бы создать веб-приложение Java, которое проверяет подпись «XADES», это приложение должно принимать два файла: исходный файл и его отдельную подпись.

Я использую библиотеку XADES4j, отличный проект. с XADES4j есть ли способ проверить подпись без проверки ссылки на файл URI? потому что данный ссылочный файл в подписи xml недоступен.

Для справочной проверки: я хочу сравнить значение дайджеста, рассчитанное из данного исходного файла, и значение дайджеста, извлеченное из файла подписи.

Вот исключение

Exception in thread "main" xades4j.XAdES4jXMLSigException: Error verifying the signature
    at xades4j.verification.XadesVerifierImpl.doCoreVerification(XadesVerifierImpl.java:285)
    at xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:188)
    at com.wct.VerifyXades.main(VerifyXades.java:33)
Caused by: org.apache.xml.security.signature.MissingResourceFailureException: The Reference for URI file:/D:/workspace/xades4j-487d7a9bb9e5/data_to_sign/test.txt has no XMLSignatureInput
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was org.apache.xml.security.utils.resolver.ResourceResolverException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was java.io.FileNotFoundException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
    at org.apache.xml.security.signature.Manifest.verifyReferences(Manifest.java:412)
    at org.apache.xml.security.signature.SignedInfo.verify(SignedInfo.java:256)
    at org.apache.xml.security.signature.XMLSignature.checkSignatureValue(XMLSignature.java:764)
    at org.apache.xml.security.signature.XMLSignature.checkSignatureValue(XMLSignature.java:696)
    at xades4j.verification.XadesVerifierImpl.doCoreVerification(XadesVerifierImpl.java:278)
    ... 2 more

Вот исходный код, который я использую для проверки подписи XADES:

package com.wct;

import java.io.FileInputStream;
import java.security.cert.X509CertSelector;
import java.security.cert.X509Certificate;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import xades4j.providers.CertificateValidationException;
import xades4j.providers.CertificateValidationProvider;
import xades4j.providers.ValidationData;
import xades4j.verification.UnexpectedJCAException;
import xades4j.verification.XAdESVerificationResult;
import xades4j.verification.XadesVerificationProfile;
import xades4j.verification.XadesVerifier;

public class VerifyXades {

    public static void main(String[] args) throws Exception {
        CertificateValidationProvider certValidator = new CertificateValidationProviderImpl();
        XadesVerificationProfile p = new XadesVerificationProfile(certValidator);
        p.acceptUnknownProperties(true);
        XadesVerifier v = p.newVerifier();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new FileInputStream("data_signed/detachedTestSignature.xml"));
        XAdESVerificationResult vr = v.verify(doc.getDocumentElement(), null);
    }
}

class CertificateValidationProviderImpl implements CertificateValidationProvider {
    @Override
    public ValidationData validate(X509CertSelector certSelector,
            Date validationDate, Collection<X509Certificate> otherCerts)
            throws CertificateValidationException, UnexpectedJCAException {
        return new ValidationData((List<X509Certificate>) otherCerts);
    }
}

Я новичок в разработке подписи/проверки, и у меня нет хорошего опыта. пожалуйста помоги

Заранее спасибо за вашу помощь


person Khalilos    schedule 05.12.2014    source источник


Ответы (1)


Вы не должны делать дайджесты сравнения чего бы то ни было. Файл должен быть каким-то образом доступен, чтобы ссылка могла быть проверена в рамках проверки подписи.

Вы контролируете генерацию подписи? ЕСЛИ это так, вам следует изменить URI на относительный URI или, возможно, использовать анонимную ссылку (дополнительная информация ниже). В любом случае все ваши варианты будут основаны на Параметры верификации подписи.

Если вы можете изменить подтверждение подписи:

  • Используйте относительный URI файла в ссылке и укажите базовый URI в обеих подписях производство и подтверждение. Есть примеры на тестах xades4j.
  • Используйте анонимную ссылку (без атрибута URI) и укажите данные с помощью AnonymousDataObjectReference при создании подписи и соответствующий ввод в подтверждение.

Если вы не можете изменить создание подписи:

person lgoncalves    schedule 08.12.2014
comment
В нашем случае мы не можем изменить производство подписи. по сути наша программа должна взять отсоединенную подпись и исходный файл. Я хочу использовать ResourceResolver, но, к сожалению, XadesVerifier всегда проверяет uri файла из отдельной подписи. вот исходный код, используемый для создания экземпляра ResourceResolver ResourceResolver resolver = ResourceResolver.getInstance(doc.createAttribute("URI"), "file:/D:/workspace/xades4j-487d7a9bb9e5/data_to_sign/test11.txt", false); options.useResourceResolver(resolver); - person Khalilos; 09.12.2014
comment
Я не понимаю ваш код. Он пытается получить существующий преобразователь. Я предложил использовать собственный преобразователь, который имеет вашу логику игнорирования фактического URI. На самом деле вам нужно реализовать ResourceResolverSpi и передать его в ResourceResolver. Вероятно, вы можете посмотреть на реализацию ResolverLocalFilesystem. - person lgoncalves; 09.12.2014