xmlsec не может проверить подпись

Я пытаюсь проверить подпись XML (прикреплена внизу вопроса) с помощью утилиты xmlsec1. Однако при выполнении команды

xmlsec1 --verify test.xml

Я получаю следующую трассировку стека:

func = xmlSecXPathDataExecute: file = xpath.c: line = 273: obj = unknown: subj = xmlXPtrEval: error = 5: Ошибка библиотечной функции libxml2: expr = xpointer (id ('uuid-73c06e86-88d2-4204-91f4-3d484bc )) func = xmlSecXPathDataListExecute: file = xpath.c: line = 373: obj = unknown: subj = xmlSecXPathDataExecute: error = 1: Ошибка библиотечной функции xmlsec: func = xmlSecTransformXPathExecute: file = xpath.c: line = xpoin = 483: obj : subj = xmlSecXPathDataExecute: error = 1: сбой функции библиотеки xmlsec: func = xmlSecTransformDefaultPushXml: file = transforms.c: line = 2411: obj = xpointer: subj = xmlSecTransformExecute: error = 1: Ошибка библиотечной функции xmlsecutecuteCTransform = xmlsec. = transforms.c: line = 1242: obj = unknown: subj = xmlSecTransformPushXml: error = 1: Ошибка библиотечной функции xmlsec: transform = xpointer func = xmlSecTransformCtxExecute: file = transforms.c: line = 1302: obj = unknown: subjEx = xmlSecTransformcutexml : error = 1: сбой функции библиотеки xmlsec: func = xmlSecDSigReferenceCtxProcessNode: file = xmldsig.c: line = 1589: obj = unknown: subj = xmlSec TransformCtxExecute: error = 1: сбой библиотечной функции xmlsec: func = xmlSecDSigCtxProcessSignedInfoNode: file = xmldsig.c: line = 822: obj = unknown: subj = xmlSecDSigReferenceCtxProcessNode: error = 1: сбой функции библиотеки xmlsecSignature = xmlSeccess = xmldsig.c: line = 563: obj = unknown: subj = xmlSecDSigCtxProcessSignedInfoNode: error = 1: Ошибка библиотечной функции xmlsec: func = xmlSecDSigCtxVerify: file = xmldsig.c: line = 382: obj = unknown: subj = xmlSecDSigature: error 1: сбой функции библиотеки xmlsec: Ошибка: ошибка подписи ОШИБКА Ссылки SignedInfo (ok / all): 0/1 Manifests References (ok / all): 0/0 Ошибка: не удалось проверить файл "test.xml" `` `

Основываясь на трассировке стека, я предполагаю, что с идентификатором что-то не так. Покопавшись, я обнаружил, что выполнение

xmlsec1 --verify --id-attr:ID 
"urn:oasis:names:tc:SAML:2.0:protocol:Response" test.xml

производит следующую трассировку стека

func = xmlSecOpenSSLEvpDigestVerify: file = digests.c: line = 249: obj = sha1: subj = unknown: error = 12: недопустимые данные: данные и дайджест не соответствуют FAIL SignedInfo References (ok / all): 0/1 Manifests References ( ok / all): 0/0 Ошибка: не удалось проверить файл "test.xml"

Вот обрезанное содержимое test.xml файла:

<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://localhost/login" ID="uuid-73c06e86-88d2-4204-91f4-3d484bc782cc" InResponseTo="_bbaf45ef713be7a8c8701e41118ec2278cbf32828f" IssueInstant="2016-02-29T14:16:31.142Z" Version="2.0">
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">idp-name</saml2:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
            <ds:Reference URI="#uuid-73c06e86-88d2-4204-91f4-3d484bc782cc">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <ds:DigestValue>H9ffPJ6/jq25p13BcziR0hNLkGg=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>FegjeG..pJEQ==</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>MIIFIj..mV7A==</ds:X509Certificate>
            </ds:X509Data>
            <ds:X509Data>
                <ds:X509Certificate>MIIFDj..5uLcw=</ds:X509Certificate>
            </ds:X509Data>
            <ds:X509Data>
                <ds:X509Certificate>MIIE/z..3IDhA=</ds:X509Certificate>
            </ds:X509Data>
            <ds:X509Data>
                <ds:X509Certificate>MIIEkT..h5/WrQ8</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
    <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="uuid-201bfc86-e7d7-4dca-bdb5-2263b2d27c22" IssueInstant="2016-02-29T14:16:01.175Z" Version="2.0">
        <saml2:Issuer>idp-name</saml2:Issuer>
        <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:SignedInfo>
                <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                <ds:Reference URI="#uuid-201bfc86-e7d7-4dca-bdb5-2263b2d27c22">
                    <ds:Transforms>
                        <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                    </ds:Transforms>
                    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                    <ds:DigestValue>EJzD3pVZwkvFkh8IX0xyF7tmP2k=</ds:DigestValue>
                </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>b3ONeh..zOEw==</ds:SignatureValue>
            <ds:KeyInfo>
                <ds:X509Data>
                    <ds:X509Certificate>MIIFIj..mV7A==</ds:X509Certificate>
                </ds:X509Data>
                <ds:X509Data>
                    <ds:X509Certificate>MIIFDj..5uLcw=</ds:X509Certificate>
                </ds:X509Data>
                <ds:X509Data>
                    <ds:X509Certificate>MIIE/z..3IDhA=</ds:X509Certificate>
                </ds:X509Data>
                <ds:X509Data>
                    <ds:X509Certificate>MIIEkT..5/WrQ8</ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </ds:Signature>
    </saml2:Assertion>
</saml2p:Response>

Не могли бы вы объяснить мне, что я здесь делаю не так? Как проверить подписанный XML-файл с помощью xmlsec?


person Artur Rychlewicz    schedule 01.03.2016    source источник


Ответы (1)


Я нашел правильный способ проверить это, поэтому вот как:

Сначала необходимо указать атрибут ID:

xmlsec1 --verify --id-attr:ID "urn:oasis:names:tc:SAML:2.0:protocol:Response" test.xml

Выполнение этой команды для моего XML-файла привело к ошибке invalid data:data and digest do not match.

Я вызываю эту команду для вывода, возвращаемого SAML Tracer (надстройка Firefox), который форматирует XML - это изменяет подпись, поэтому xmlsec1 выводит ошибку.

Вызов xmlsec1 для исходного (дешифрованного) содержимого работает нормально.

person Artur Rychlewicz    schedule 03.03.2016
comment
Я боролся с той же проблемой, и это спасло мне день. На самом деле не очевидно, что для работы xmlsec требуется неформатированный ввод, декодированный в формате base64. - person d3day; 15.11.2018
comment
Для записи: форматированный XML канонически отличается от неформатированного XML, предполагая, что форматирование вставляет пробелы между тегами - xmlsec1 работает в соответствии со спецификацией, хотя это удивительно - person nimish; 08.08.2019