Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.08.2015(UTC) Сообщений: 33 ![Беларусь Беларусь](/forum2/Content/images/flags/BY.png) Сказал(а) «Спасибо»: 23 раз
|
Добрый день. Пытаюсь подписать часть XML документа: Код:val documentToSign: Elem =
<PatientRecord>
<Name>John Doe</Name>
<Account id="acct">123456</Account>
<Visit date="10pm March 10, 2002">
<Diagnosis>Broken second metacarpal</Diagnosis>
</Visit>
<Sig></Sig>
</PatientRecord>
val jdkDocumentToSign = xpath.evaluate("//Visit", documentToSign, XPathConstants.NODE).asInstanceOf[Node]
т.е. я хочу подписать, только Visit тег + то, что внтури него. Код: // Провайдер XMLDSigRI.
val pxml = new XMLDSigRI
val sigFactory: XMLSignatureFactory = XMLSignatureFactory.getInstance("DOM", pxml)
// signing whole document
val referenceURI = ""
val transforms: List[Transform] = List(
sigFactory.newTransform(Transform.ENVELOPED, null.asInstanceOf[TransformParameterSpec]),
sigFactory.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, null.asInstanceOf[XMLStructure])
)
// Ссылка на подписываемые данные с указанием алгоритма хеширования.
val signAlgName = Consts.URI_GOST_SIGN
val digestAlgName = Consts.URI_GOST_DIGEST
val ref = sigFactory.newReference(referenceURI, sigFactory.newDigestMethod(digestAlgName, null), transforms.asJava, null, null)
// Создаем объект SignedInfo с указанием алгоритма подписи.
val signedInfo = sigFactory.newSignedInfo(sigFactory.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,
null.asInstanceOf[C14NMethodParameterSpec]), sigFactory.newSignatureMethod(signAlgName, null), List(ref).asJava)
val keyInfoFactory: KeyInfoFactory = sigFactory.getKeyInfoFactory
var keyInfo: KeyInfo = null
// Создаем X509Data, содержащий сертификат.
val x509d: X509Data = keyInfoFactory.newX509Data(Collections.singletonList(cert))
// Создаем KeyInfo и добавляем X509Data в него.
keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509d))
val dsc: DOMSignContext = new DOMSignContext(privateKey, parentSigNodes)
dsc.setProperty("org.jcp.xml.dsig.internal.dom.SignatureProvider", JCSP.PROVIDER_NAME)
// Создаем XMLSignature.
val signature = sigFactory.newXMLSignature(signedInfo, keyInfo)
// Подписываем.
signature.sign(dsc)
val os: OutputStream = new FileOutputStream("Sign.xml")
val trans: Transformer = TransformerFactory.newInstance.newTransformer
trans.transform(new DOMSource(jdkWholeDocument), new StreamResult(os))
Но, такое ощущение, что он подписывает все равно весь документ. В логах видно такое сообщение: Код:
2016-06-06 13:36:13 DEBUG r.C.J.d.i.DigesterOutputStream requestId=unknown userId=unknown origin=unknown companyId=unknown success=unknown - Pre-digested input:
2016-06-06 13:36:13 DEBUG r.C.J.d.i.DigesterOutputStream requestId=unknown userId=unknown origin=unknown companyId=unknown success=unknown - <PatientRecord>
<Name>John Doe</Name>
<Account id="acct">123456</Account>
<Visit date="10pm March 10, 2002">
<Diagnosis>Broken second metacarpal</Diagnosis>
</Visit>
<Sig></Sig>
</PatientRecord>
Как правильно подписать только часть XML документа? Спасибо.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Здравствуйте. Возможно, проблема в строке: Автор: mikla ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) referenceURI = "" Если не ошибаюсь, "" означает весь документ. |
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
mikla оставлено 06.06.2016(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.08.2015(UTC) Сообщений: 33 ![Беларусь Беларусь](/forum2/Content/images/flags/BY.png) Сказал(а) «Спасибо»: 23 раз
|
Автор: afev ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) Здравствуйте. Возможно, проблема в строке: Автор: mikla ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) referenceURI = "" Если не ошибаюсь, "" означает весь документ. Да, верное, если указать ID элемента #Visit, например, то подпишет только <Visit> таг. Можно ли как-то указать какой набор данных подписывать с помощью XPath?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Думаю, можно, с помощью Transform.XPATH, как-то так (пример SignFileExample в пакете JCPxml.dsig.internal.xmldsigri.tests в samples-sources.jar в архиве JCP или http://www.xinotes.net/notes/note/751/):Код:
String PATH = "/PatientRecord/Account";
String referenceURI = "";
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile(xPath);
Document document = ...
NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
Node nodeToSign = nodes.item(0);
Node sigParent = nodeToSign.getParentNode();
transforms = new ArrayList<Transform>() {{
add(sigFactory.newTransform(
Transform.XPATH,
new XPathFilterParameterSpec(PATH)
)
);
add(sigFactory.newTransform(
Transform.ENVELOPED,
(TransformParameterSpec) null
)
);
}};
Reference ref = sigFactory.newReference(
referenceURI,
sigFactory.newDigestMethod(..., null),
transforms,
null,
null
);
DOMSignContext dsc = new DOMSignContext(privateKey, sigParent);
XMLSignature signature = sigFactory.newXMLSignature(signedInfo, keyInfo);
signature.sign(dsc);
|
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
mikla оставлено 06.06.2016(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.08.2015(UTC) Сообщений: 33 ![Беларусь Беларусь](/forum2/Content/images/flags/BY.png) Сказал(а) «Спасибо»: 23 раз
|
Спасибо. а referenceURI = "" - это верно в данном случае? Автор: afev ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) Думаю, можно, с помощью Transform.XPATH, как-то так (пример SignFileExample в пакете JCPxml.dsig.internal.xmldsigri.tests в samples-sources.jar в архиве JCP или http://www.xinotes.net/notes/note/751/):Код:
String PATH = "/PatientRecord/Account";
String referenceURI = "";
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile(xPath);
Document document = ...
NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
Node nodeToSign = nodes.item(0);
Node sigParent = nodeToSign.getParentNode();
transforms = new ArrayList<Transform>() {{
add(sigFactory.newTransform(
Transform.XPATH,
new XPathFilterParameterSpec(PATH)
)
);
add(sigFactory.newTransform(
Transform.ENVELOPED,
(TransformParameterSpec) null
)
);
}};
Reference ref = sigFactory.newReference(
referenceURI,
sigFactory.newDigestMethod(..., null),
transforms,
null,
null
);
DOMSignContext dsc = new DOMSignContext(privateKey, sigParent);
XMLSignature signature = sigFactory.newXMLSignature(signedInfo, keyInfo);
signature.sign(dsc);
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
По идее, так. Можно проверить, меняя данные вне узла (подпись должна провериться) и внутри узла (ошибка при проверке). |
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
mikla оставлено 23.06.2016(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close