Дайджест ссылки на XML-подпись использует родительское пространство имен

Мне нужно подписать XML-файл на Java, который должен содержать 3 References.
Хотя 2 из них действительны (ожидаемый дайджест == фактический дайджест), один недействителен.
Соответствующая часть XML выглядит подобно:

<QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.3.2#" Target="Signature1">
    <SignedProperties Id="SignedProperties_1">
        <SignedSignatureProperties>
            <SigningTime>2014-11-27T13:49:36</SigningTime>
        </SignedSignatureProperties>
    </SignedProperties>
</QualifyingProperties>

Reference ссылается только на Element "SignedProperties" и его дочерние элементы.
Как видите, "QualifyingProperties" Element определяет пространство имен (xmlns="http://uri.etsi.org/01903/v1.3.2#"), и я думаю, что проблема в этом:

Посмотрев журнал, я обнаружил, что значение «Pre-Digest» выглядит так:

<SignedProperties xmlns="http://uri.etsi.org/01903/v1.3.2#" Id="SignedProperties_1">
    <SignedSignatureProperties>
        <SigningTime>2014-11-27T13:49:36</SigningTime>
    </SignedSignatureProperties>
</SignedProperties>

В то время как "SignedProperties" Element в реальном файле не содержит пространства имен, но его родитель содержит.
Я обнаружил, что фактический дайджест соответствует SHA-256 значения "Pre-Digest", в то время как ожидаемый дайджест соответствует SHA-256 реального файла (без пространства имен).

Reference создается с помощью следующего кода:

Reference sigPropRef = fac.newReference("#SignedProperties_1", fac.newDigestMethod(DigestMethod.SHA256, null),
    Collections.singletonList(sigPropTransform), "http://uri.etsi.org/01903#SignedProperties", "reference-signedpropeties"
);

Где sigPropTransform это CanonicalizationMethod.EXCLUSIVE Transform.

Мой вопрос в том, как я могу решить проблему, то есть как я могу предотвратить добавление пространства имен в «SignedProperties» Element перед вычислением дайджеста?

Если вам нужна какая-либо другая информация, пожалуйста, оставьте комментарий, я новичок в этой теме, поэтому я не уверен, какая информация актуальна, а какая нет.
Большое спасибо!

EDIT: Немного поигравшись, мне кажется, что «фактический дайджест» — это дайджест, рассчитанный валидатором, а «ожидаемый дайджест» — это дайджест внутри «DigestValue» Element.
Это означает, что значение дайджеста внутри моего файла совпадает с SHA-256 указанной части файла, но валидатор по какой-то причине вычисляет дайджест С родительским пространством имен.
Итак, я думаю, что мне нужно включить parent в моем расчете дайджеста.

РЕДАКТИРОВАТЬ: я продолжил играть, и теперь у меня есть не только значение Pre-Digest валидатора, но и значение моего "дайджест-расчета".
Это дает мне:

<SignedProperties Id="SignedProperties_1"><SignedSignatureProperties><SigningTime>2014-11-27T15:51:26</SigningTime></SignedSignatureProperties></SignedProperties>  

когда я даю ему следующее Transform:

Transform sigPropTransform = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (ExcC14NParameterSpec)null);  

А также:

<SignedProperties xmlns:ds="some-url" xmlns:msg="some-other-url" Id="SignedProperties_1"><SignedSignatureProperties><SigningTime>2014-11-27T15:52:49</SigningTime></SignedSignatureProperties></SignedProperties>

когда я не даю ему Transform.
Пространство имен xmlns="http://uri.etsi.org/01903/v1.3.2#" никогда не включается.

Как включить?


person Springrbua    schedule 27.11.2014    source источник


Ответы (2)


Боюсь, вы не можете запретить добавление пространства имен - оно добавляется во время канонизации. Это помогло мне, когда у меня была идентичная проблема;)

person rzysia    schedule 27.11.2014
comment
Привет, спасибо за ответ. Вы уже прочитали мой РЕДАКТИРОВАТЬ? Я уже узнал, что пространство имен добавляется автоматически во время канонизации, так что теперь мне кажется, что мне нужно добавить его в мой расчет дайджеста. Пространство имен родителей является пространством имен без префикса. Как сообщить канонизации, что она должна использовать ее для расчета дайджеста? - person Springrbua; 27.11.2014
comment
рассчитать дайджест для создания синатуры или для проверки подписи? Потому что, если вы делаете подпись самостоятельно, вы можете рассчитать дайджест, например. ‹Подписанные свойства› точно так же, как это делает валидатор - person rzysia; 27.11.2014
comment
Я не делаю это сам, я использую для этого Reference. Мне нужно дать ему правильные Transforms, чтобы он включал безымянное пространство имен. Если я не даю ему Transform, он включает все пространства имен, определенные во всем документе, кроме одного без префикса (тот, который он должен включать). Если я использую Exclusive Cannonicalization, он не включает пространство имен. Я обновлю вопрос! - person Springrbua; 27.11.2014
comment
Решение найдено (см. мой ответ). Проблема заключалась в том, что пространство имен было зарегистрировано не как пространство имен, а только как обычный атрибут. Спасибо, что указали мне правильное направление. +1 - person Springrbua; 27.11.2014

После еще нескольких попыток я, наконец, нашел настоящую проблему, а также решение:
Как я уже говорил в вопросе, вычисление дайджеста не использовало пространство имен родителей, определенное как xmlns="http://uri.etsi.org/01903/v1.3.2#".
Это произошло потому, что я никогда не "регистрировал" его как пространство имен, а только добавил как обычное Attribute. Чтобы «зарегистрировать» пространство имен, мне нужно вызвать setAttributeNS вместо setAttribute.
Тогда код выглядит примерно так:

Element eQualifyingProperties= doc.createElement("QualifyingProperties");
eQualifyingProperties.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "http://uri.etsi.org/01903/v1.3.2#");   

Первый параметр — это uri пространства имен Attribute, а поскольку Attribute — это пространство имен, он является URI пространств имен XML.
Второй параметр — это имя атрибута, поскольку оно не должно иметь префикса, это просто "xmlns".
Третий параметр — фактическое значение атрибута, то есть пространство имен, которое я хочу "зарегистрировать".
Element eQualifyingProperties является родителем "SignedProperties" Element.

После регистрации пространства имен как реального пространства имен (а не атрибута) определенные Transform

Transform sigPropTransform = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (ExcC14NParameterSpec)null);  

включает его в расчет дайджеста.

Я нашел это решение в этом ответе на SO.

person Springrbua    schedule 27.11.2014