Статус: Новичок
Группы: Участники
Зарегистрирован: 02.08.2017(UTC) Сообщений: 3 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва
|
Добрый день. Задача: подписать 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.
|