Мне нужно подписать XML-файл на Java, который должен содержать 3 Reference
s.
Хотя 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#"
никогда не включается.
Как включить?