Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dygor  
#1 Оставлено : 2 августа 2017 г. 14:37:19(UTC)
dygor

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.08.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Добрый день.

Задача: подписать XML стандартом XMLdsign с использованием:

SignatureMethod http://www.w3.org/2001/0...#gostr34102001-gostr3411
DigestMethod http://www.w3.org/2001/04/xmldsig-more#gostr3411

Исходные данные:
1. JDK 1.8_141
2. GlassFish 4.1.2
3. jcp-2.0.39014

Standalone java app прекрасно работает, на GlassFish - нет.

Выполнил действия согласно инструкции "ЖТЯИ.00091-01 33 01. Руководство программиста.pdf" пункта 7.
0. Воспользовался стандартным setup.exe;
1. В JRE скопировал: commons-logging-1.1.1.jar, serializer-2.7.1.jar, xalan-2.7.0.jar, xmlsec-1.5.0.jar-без этого вообще ничего не работало.
2. Пришлось commons-logging-1.1.1.jar скопировать в ... glassfish4\glassfish\modules\ , без этого тоже не подцеплялся логер

Код 1 (из вашего пример SignFileExample.java):
Цитата:
Provider pNew = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();

/*Security.addProvider(pNew);
Security.getProvider("XMLDSig").put("XMLSignatureFactory.DOM",
"ru.CryptoPro.JCPxml.dsig.internal.dom.DOMXMLSignatureFactory");
Security.getProvider("XMLDSig").put("KeyInfoFactory.DOM",
"ru.CryptoPro.JCPxml.dsig.internal.dom.DOMKeyInfoFactory");*/

String ALIAS = "PK_DYG_PK";
String PASSWORD = "11111111";
String PATH = "/PatientRecord/Account";

KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
//KeyStore keyStore = KeyStore.getInstance(JCSP.HD_STORE_NAME, JCP.PROVIDER_NAME);
keyStore.load(null,PASSWORD.toCharArray());
PrivateKey privateKey = (PrivateKey)keyStore.getKey(ALIAS, PASSWORD.toCharArray());
X509Certificate cert = (X509Certificate)keyStore.getCertificate(ALIAS);

if (!org.apache.xml.security.Init.isInitialized()) {
//System.setProperty("org.apache.xml.security.resource.config", "resource/jcp.xml");
org.apache.xml.security.Init.init();
}
// Инициализация сервис-провайдера.
if(!XmlInit.isInitialized()) {
XmlInit.init();
}

// Инициализация Transforms.
com.sun.org.apache.xml.internal.security.Init.init();

// Декодируем документ.
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
byte[] xmlFileData = Array.readFile("D:\\TEMP\\message.xml");
Document doc = dbFactory.newDocumentBuilder().parse(new ByteArrayInputStream(xmlFileData));

//String providerName = "ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI";
final XMLSignatureFactory sigFactory = XMLSignatureFactory.getInstance("DOM", pNew);

Node nodeToSign = null;
Node sigParent = null;
String referenceURI = null;
XPathExpression expr = null;
NodeList nodes;
List transforms = null;

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

expr = xpath.compile(PATH);
nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

if (nodes.getLength() < 1) {
throw new Exception("Invalid document, can't find node by PATH: " + PATH);
} // if

nodeToSign = nodes.item(0);
sigParent = nodeToSign.getParentNode();
referenceURI = ""; // Пустая строка означает весь документ.
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(Consts.URI_GOST_DIGEST , null),
transforms, null, null);

// Создаем объект SignedInfo с указанием алгоритма подписи.
SignedInfo signedInfo = sigFactory.newSignedInfo(
sigFactory.newCanonicalizationMethod(
CanonicalizationMethod.EXCLUSIVE, (C14NMethodParameterSpec) null),
sigFactory.newSignatureMethod(Consts.URI_GOST_SIGN, null),
Collections.singletonList(ref)
);

KeyInfoFactory keyInfoFactory = sigFactory.getKeyInfoFactory();
KeyInfo keyInfo = null;

KeyValue keyValue = keyInfoFactory.newKeyValue(cert.getPublicKey());

// Создаем KeyInfo и добавляем KeyValue в него.
keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(keyValue));

DOMSignContext dsc = new DOMSignContext(privateKey, sigParent);

dsc.setProperty("org.jcp.xml.dsig.internal.dom.SignatureProvider", "JCP");

// Создаем XMLSignature.
javax.xml.crypto.dsig.XMLSignature signature = sigFactory.newXMLSignature(signedInfo, keyInfo);

// Подписываем.
signature.sign(dsc);

// Вывод результата.
OutputStream os = new FileOutputStream("D:\\Temp\\out.msg");
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));


Ошибка при вызове signature.sign(dsc); : Couldn't find Transform for: http://www.w3.org/TR/1999/REC-xpath-19991116

Код 2:


Цитата:

...
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
doc = dbf.newDocumentBuilder().newDocument();

//setSignMethod(Consts.URI_GOST_SIGN);
setSignMethod(Const.URI_SIGN_2012);

//setDigestMethod(Consts.URI_GOST_DIGEST);
setDigestMethod(Const.URI_DIGEST_2012);

...
if (!XmlInit.isInitialized())
XmlInit.init();
*//*

// Инициализация Transforms.
com.sun.org.apache.xml.internal.security.Init.init();
// Инициализация сервис-провайдера.
if(!XmlInit.isInitialized()) {
XmlInit.init();
}
..
XMLSignature sig = new XMLSignature(doc, "", getSignMethod());
doc.appendChild(sig.getElement());
doc.importNode(node, true);


Ошибка: при вызове XMLSignature sig = new XMLSignature(doc, "", getSignMethod()); org.apache.xml.security.signature.XMLSignatureException: The requested algorithm urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512 does not exist.

Offline Андрей Писарев  
#2 Оставлено : 2 августа 2017 г. 15:04:42(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: dygor Перейти к цитате
Добрый день.

Задача: подписать XML стандартом XMLdsign с использованием:

SignatureMethod http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411
DigestMethod http://www.w3.org/2001/04/xmldsig-more#gostr3411



Здравствуйте.

А почему в коде указываете 2012 ГОСТ, а не 2001?

Цитата:
//setSignMethod(Consts.URI_GOST_SIGN);
setSignMethod(Const.URI_SIGN_2012);

//setDigestMethod(Consts.URI_GOST_DIGEST);
setDigestMethod(Const.URI_DIGEST_2012);
Техническую поддержку оказываем тут
Наша база знаний
Offline dygor  
#3 Оставлено : 2 августа 2017 г. 15:16:15(UTC)
dygor

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.08.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Цитата:
А почему в коде указываете 2012 ГОСТ, а не 2001?


Это уже эксперементы. Если указать либо все 2001, либо 2012 ошибки одни и те же.


Offline dygor  
#4 Оставлено : 3 августа 2017 г. 7:30:08(UTC)
dygor

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.08.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Коллеги, что-нибудь подскажете? Если есть необходиомсть могу прям WAR или EAR дать.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.