Проверка подписи XADES

Я использую приведенный ниже код Java для проверки подписи XML с помощью xades4j.

    NodeList nl = doc.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature");

    FileSystemDirectoryCertStore certStore = new
            FileSystemDirectoryCertStore("cert/store/");
    KeyStore ks;
    try (FileInputStream fis = new FileInputStream("cert/store/myStore")) {
        ks = KeyStore.getInstance("jks");
        ks.load(fis, "password".toCharArray());
    } 
    CertificateValidationProvider provider = new PKIXCertificateValidationProvider( ks, false,certStore.getStore() );

    XadesVerificationProfile profile = new XadesVerificationProfile(provider);
    org.w3c.dom.Element sigElem = (org.w3c.dom.Element) nl.item(0);
    XAdESVerificationResult r = profile.newVerifier().verify(sigElem, null);

Но я получаю приведенное ниже исключение, и в нем говорится, что значения дайджеста не равны.

xades4j.verification.ReferenceValueException: Reference '#xmldsig-xxxx-abc-object11' cannot be validated

Ниже приведен файл XML (я заменил фактические данные фиктивными данными)

    <ds:Signature xmlns:ds = "http://www.w3.org/2000/09/xmldsig#" Id = "xmldsig-abc">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
        <ds:SignatureMethod Algorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
        <ds:Reference Id = "xmldsig-aee6fb07-8566-47eb-acb7-abc-ref0"
                      Type = "http://www.w3.org/2000/09/xmldsig#Object"
                      URI = "#xmldsig-xxx-abc-object11">
            <ds:DigestMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#sha256"/>
            <ds:DigestValue>XXXX</ds:DigestValue>
        </ds:Reference>
        <ds:Reference Type = "http://uri.etsi.org/01903#SignedProperties"
                      URI = "#xmldsig-xxx-abc-signedprops">
            <ds:Transforms>
                <ds:Transform Algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#sha256"/>
            <ds:DigestValue>XXXXX</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue Id = "xmldsig-xxxx-sigvalue">XXXXX
    </ds:SignatureValue>
    <ds:KeyInfo>
        <ds:X509Data>
            <ds:X509Certificate>xXxxxxxx
            </ds:X509Certificate>
            <ds:X509IssuerSerial>
                <ds:X509IssuerName>xxxxx</ds:X509IssuerName>
                <ds:X509SerialNumber>xxxx</ds:X509SerialNumber>
            </ds:X509IssuerSerial>
            <ds:X509SubjectName>xxxxx
            </ds:X509SubjectName>
        </ds:X509Data>
    </ds:KeyInfo>
    <ds:Object Id = "xmldsig-xxx-abc-object11">
        <ns2:Vehicle xmlns:ns2 = "xx:xx"
                            xmlns = "xx:xx"> 
                            .................................
        </ns2:Vehicle>
    </ds:Object>
    <ds:Object>
        <xades:QualifyingProperties xmlns:xades = "http://uri.etsi.org/01903/v1.3.2#"
                                    xmlns:xades141 = "http://uri.etsi.org/01903/v1.4.1#"
                                    Target = "#xmldsig-xxx-abc">
            <xades:SignedProperties Id = "xmldsig-xxx-abc-signedprops">
                <xades:SignedSignatureProperties>
                    <xades:SigningTime>xxxxxxx</xades:SigningTime>
                    <xades:SigningCertificate>
                        <xades:Cert>
                            <xades:CertDigest>
                                <ds:DigestMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#sha256"/>
                                <ds:DigestValue>xxxxxxxxxx</ds:DigestValue>
                            </xades:CertDigest>
                            <xades:IssuerSerial>
                                <ds:X509IssuerName>xxxxxxxxxxx
                                </ds:X509IssuerName>
                                <ds:X509SerialNumber>xxxxxxxxxxx</ds:X509SerialNumber>
                            </xades:IssuerSerial>
                        </xades:Cert>
                        <xades:Cert>
                            <xades:CertDigest>
                                <ds:DigestMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#sha256"/>
                                <ds:DigestValue>xxxxxxxxx</ds:DigestValue>
                            </xades:CertDigest>
                            <xades:IssuerSerial>
                                <ds:X509IssuerName>xxxxxxxxxx
                                </ds:X509IssuerName>
                                <ds:X509SerialNumber>xxxxxxxxxxxx</ds:X509SerialNumber>
                            </xades:IssuerSerial>
                        </xades:Cert>
                        <xades:Cert>
                            <xades:CertDigest>
                                <ds:DigestMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#sha256"/>
                                <ds:DigestValue>xxxxxxxxx</ds:DigestValue>
                            </xades:CertDigest>
                            <xades:IssuerSerial>
                                <ds:X509IssuerName>xxxxxxxxxxxx
                                </ds:X509IssuerName>
                                <ds:X509SerialNumber>xxxxxxxxxxxx</ds:X509SerialNumber>
                            </xades:IssuerSerial>
                        </xades:Cert>
                    </xades:SigningCertificate>
                </xades:SignedSignatureProperties>
                <xades:SignedDataObjectProperties>
                    <xades:CommitmentTypeIndication>
                        <xades:CommitmentTypeId>
                            <xades:Identifier>http://uri.etsi.org/01903/v1.2.2#ProofOfOrigin</xades:Identifier>
                            <xades:Description>xxxxxxxxxxxxx
                            </xades:Description>
                        </xades:CommitmentTypeId>
                        <xades:AllSignedDataObjects/>
                    </xades:CommitmentTypeIndication>
                </xades:SignedDataObjectProperties>
            </xades:SignedProperties>
        </xades:QualifyingProperties>
    </ds:Object>
</ds:Signature>

У меня есть два вопроса, и я пытаюсь выяснить.

  1. Правилен ли подход, который я использую для проверки этого XML-документа?
  2. Причина получения «xades4j.verification.ReferenceValueException: ссылка '#xmldsig-xxxx-abc-object11' не может быть проверена», и значения дайджеста не совпадают.

Редактировать (14-11-22): Мне удалось решить проблему с проверкой xades. Ниже приведены две ошибки, которые я сделал.

  1. Считайте подписанный файл XML с диска. Я думаю, что файл был изменен или не смог правильно прочитать. Вместо чтения с диска я проверить строку, возвращенную из API напрямую.
  2. Получается, что я должен использовать корневой сертификат для проверки.

Теперь я пытаюсь проверить XMLDsig, используя приведенный ниже код.

    NodeList nl = doc.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature");
DOMValidateContext valContext = new DOMValidateContext(new KeyValueKeySelector(), nl.item(0));
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
 XMLSignature signature = fac.unmarshalXMLSignature(valContext);
signature.validate(valContext);

  

Это дает мне следующее исключение

om.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID xmldsig-xxx-abc-signedprops

Ошибка связана с проблемой схемы. Тег SignatureValue должен содержать строку с основанием 64. XML-файл проверяется и не находит допустимую строку с основанием 64 во внутреннем тексте тега.

jdweng 14.11.2022 06:06
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
0
1
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось найти ответ для проверки xades. Ниже приведены две ошибки, которые я сделал.

  1. Считайте подписанный файл XML с диска. Я думаю, что файл был изменен или не может быть правильно прочитан. Вместо чтения с диска я проверяю строку, возвращаемую API напрямую.
  2. Получается, что я должен использовать корневой сертификат для проверки.

Другие вопросы по теме