Статус: Новичок
Группы: Участники
Зарегистрирован: 02.03.2020(UTC) Сообщений: 2
|
Добрый день, знатоки! Помогите разобраться новичку :) Не понятно что конкретно участвует в расчете хеш. Вот полный документ который отправляется на подпись: Код:<doc:document
xmlns:cct="http://emias.mos.ru/simi/cct"
xmlns:doc="http://emias.mos.ru/simi/document"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:simicore="http://emias.mos.ru/simi/core">
<doc:metadata>
<doc:documentId>ecd99ae4-b15c-46f0-a98c-c16aeb7619a2</doc:documentId>
<doc:documentInfo>
<simicore:patientId>79812</simicore:patientId>
</doc:documentInfo>
</doc:metadata>
<doc:content mimeClass="APPLICATION" mimeType="application/tdd" valid="true"><doc:data>MDAx</doc:data></doc:content>
<doc:signature signeeLogin="username" technicalSignature="true"/>
</doc:document>
По замыслу в расчете хеш должен участвовать только тег doc:content с содержимым Код:
org.apache.xml.security.Init.init();
JCPXMLDSigInit.init();
Document doc = --указанный выше документ
/*при парсинге документа указано что
factory.setNamespaceAware(true);
*/
String providerName = "ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI";
final XMLSignatureFactory sigFactory = XMLSignatureFactory.getInstance("DOM",(Provider) Class.forName(providerName).newInstance());
NodeList signNodes = CryptoUtils.xPathToNodeList(doc, "//*[local-name() = 'signature']");
Node sigParent = signNodes.item(0);
String referenceURI = ""; // Пустая строка означает весь документ.
List transforms = new ArrayList<Transform>() {{
add(sigFactory.newTransform(Transform.XPATH, new XPathFilterParameterSpec(xpathString)));//xpathString = //doc:content
add(sigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null));
}};
Reference ref = sigFactory.newReference(referenceURI,
sigFactory.newDigestMethod(Consts.URN_GOST_DIGEST_2012_256, null), transforms, null, null);
SignedInfo signedInfo = sigFactory.newSignedInfo(
sigFactory.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, (C14NMethodParameterSpec) null),
sigFactory.newSignatureMethod(Consts.URN_GOST_SIGN_2012_256, null), Collections.singletonList(ref));
KeyInfoFactory keyInfoFactory = sigFactory.getKeyInfoFactory();
X509Data x509d = keyInfoFactory.newX509Data(Collections.singletonList(cert));
KeyInfo keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509d));
DOMSignContext dsc = new DOMSignContext(privateKey, sigParent);
dsc.setProperty("org.jcp.xml.dsig.internal.dom.SignatureProvider", JCP.PROVIDER_NAME);
XMLSignature signature = sigFactory.newXMLSignature(signedInfo, keyInfo);
signature.sign(dsc);
в итоге получается: Код:<?xml version="1.0" encoding="UTF-8"?>
<doc:document xmlns:doc="http://emias.mos.ru/simi/document" xmlns:cct="http://emias.mos.ru/simi/cct" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:simicore="http://emias.mos.ru/simi/core">
<doc:metadata>
<doc:documentId>ecd99ae4-b15c-46f0-a98c-c16aeb7619a2</doc:documentId>
<doc:documentInfo>
<simicore:patientId>79812</simicore:patientId>
</doc:documentInfo>
</doc:metadata>
<doc:content mimeClass="APPLICATION" mimeType="application/tdd" valid="true">
<doc:data>MDAx</doc:data>
</doc:content>
<doc:signature signeeLogin="username" technicalSignature="true">
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<XPath>//doc:content</XPath>
</Transform>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<DigestValue>CnP0L9CaumMYIx0wElcSDdW4hvxmnldoZOzhnWKbG/U=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>iZiY/wLmBAnXRNLtouqudI+oyLrbuA3Bu+Z6dlqSBKPBsqnO/MnhDNwZCbcA7rzTfUfRf7w991hDlMPFLNTfcg==</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIII...</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</doc:signature>
</doc:document>
Если поменять что-то например в doc:metadata хеш будет другой. Что-то не так в xpath? Отредактировано пользователем 2 марта 2020 г. 16:32:26(UTC)
| Причина: Не указана
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Автор: MaximComse  По замыслу в расчете хеш должен участвовать только тег doc:content с содержимым Если поменять что-то например в doc:metadata хеш будет другой. Что-то не так в xpath? Добрый день. Похоже, что действительно Xpath не срабатывает, но я не очень силен в выражениях Xpath. Поясню почему Xpath для меня на втором плане: трансформ XPath далеко не везде поддерживается, поэтому наиболее общий путь добиться просто выбора заданного фрагмента без дальнейнего фильтрования внутри фрагмента - добавить в тег doc:content атрибут с типом xs:ID - в самом простом случае это "атрибут по умолчанию" Id (если его разрешает схема связанная с префиксом doc). Если сам атрибут Id не разрешен схемой, но разрешены другие схемы, то wsu:Id наиболее частое решение. И только если Id и сторонние схемы запрещены, только тогда имеет смысл выбирать тег через XPath. Итак, если Id добавить можно, тогда для тега с Id="contentdoc" нужно в референсе указать с решеткой URI="#contentdoc". Заметьте, это не исключает использования Xpath для дальнейшего выбора внутри фрагмента - например, выкидывания всех текстовых узлов. К слову, я бы рекомендовал поставить enveloped-signature трансформ первым - так на XPath пойдет именно тот документ, что был до подписи, а не документ с подписью. Отредактировано пользователем 3 марта 2020 г. 5:00:45(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.03.2020(UTC) Сообщений: 2
|
Спасибо за ответ! От перемены мест трансформаций хеш не меняется. В моем случае необходимо использовать именно xpath, ничего добавить в исходный документ я не могу. Заметил кстати интересный эффект: если xpath это какая то выборка с использованием осей (//self) например, то JCP ко всем узлам дописывает xmlns аттрибуты.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close