Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.07.2019(UTC) Сообщений: 31  Сказал(а) «Спасибо»: 2 раз
|
Автор: two_oceans  Ошибка про не найденный элемент. В коде вообще сообщения #18 творится что-то непонятное. Для начала нужно опредедиться, что есть элемент куда будет положен сертификат и есть элемент тела запроса. У них должны быть разные ID. В ID решетка не нужна (буквально выше перечисление символов допустимых в ID, среди них решетки нет), а вот в URI решетка нужна. Это нормально когда их значения отличаются на решетку. Еще раз деликом код создания документа и подписания напомните пожалуйста. Запрос на момент подписания и после подписания тоже не помешает. Вероятно дело в том, что на момент подписания еще нет элемента с ID OGRN_1025401011833. Первичный метод: Код:
public static void main( String[] args ) throws UnrecoverableKeyException, NoSuchProviderException, KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, Exception
{
System.out.println("*****************");
System.out.println("*******ФСС*******");
System.out.println("*****************");
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
CreateXml.CreateXMLSkeleton(soapMessage);
soapMessage = SignXml.Signation();
StartEncrypt.Encryption(soapMessage);
VerifyDecrypt.VerifyAndDecrypt().writeTo(System.out);
}
Подготавливаем первичный вид XML сообщений. Код:
public static void CreateXMLSkeleton(SOAPMessage soapMessage)
throws SOAPException, IOException {
SOAPEnvelope soapEnv = soapMessage.getSOAPPart().getEnvelope();
soapEnv.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema");
soapEnv.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema-instance");
soapEnv.addNamespaceDeclaration("wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
soapEnv.addNamespaceDeclaration("wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
soapEnv.addNamespaceDeclaration("end", "http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl");
SOAPBody soapBody = soapEnv.getBody();
Name name = soapEnv.createName("Id");
soapBody.addAttribute(name, "OGRN_1025401011833");
SOAPElement soapElement = soapBody.addChildElement("getNewLNNum", "end");
SOAPElement element = soapElement.addChildElement("ogrn");
element.addTextNode("1025401011833");
soapMessage.saveChanges();
SaveSOAPToXML("tempSkeleton.xml", soapMessage);
System.out.println("Файл создан");
System.out.println("*****************");
}
Выглядит так: Код:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:end="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Header/><SOAP-ENV:Body Id="OGRN_1025401011833"><end:getNewLNNum><ogrn>1025401011833</ogrn></end:getNewLNNum></SOAP-ENV:Body></SOAP-ENV:Envelope>
Далее подписываем это сообщение: Код:
public static SOAPMessage Signation() throws Exception {
X509Certificate cert = KeyCertificate.GetCertificateFromStorage("zeus");
PrivateKey privateKey = KeyCertificate.GetPrivateKey("password", "zeus");
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage message = mf.createMessage(); // ЕСЛИ берем из файла
SOAPPart soapPart = message.getSOAPPart();
FileInputStream is = new FileInputStream("C:\\Storage\\Store\\"+"tempSkeleton.xml"); // ЕСЛИ берем из файла
soapPart.setContent(new StreamSource(is)); // ЕСЛИ берем из файла
message.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
Document doc = message.getSOAPPart().getEnvelope().getOwnerDocument();
//Добавляем заголовки для помещения информации о подписи:
WSSecHeader header = new WSSecHeader();
header.setActor("http://eln.fss.ru/actor/mo/OGRN_1025401011833");
header.setMustUnderstand(false);
header.insertSecurityHeader(message.getSOAPPart().getEnvelope().getOwnerDocument());
// Элемент подписи.
Element token = header.getSecurityHeader();
// Загрузка провайдера.
Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
//logger.debug("xmlDSigProvider: {}", xmlDSigProvider);
//Добавляем описание преобразований над документом и узлом SignedInfo
final Transforms transforms = new Transforms(doc);
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);
//Преобразования над узлом ds:SignedInfo:
List<Transform> transformList = new ArrayList<Transform>();
Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
transformList.add(transformC14N);
// Ссылка на подписываемые данные с алгоритмом хеширования ГОСТ 34.11.
Reference ref = fac.newReference("#OGRN_1025401011833", fac.newDigestMethod ("urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256", null),
transformList, null, null);
//Задаём алгоритм подписи:
SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,
(C14NMethodParameterSpec) null), fac.newSignatureMethod("urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256", null), Collections.singletonList(ref));
//Создаём узел ds:KeyInfo с информацией о сертификате:
KeyInfoFactory kif = fac.getKeyInfoFactory();
X509Data x509d = kif.newX509Data(Collections.singletonList(cert));
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
//Подписываем данные в элементе token:
javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki); //
DOMSignContext signContext = new DOMSignContext(privateKey, token); //
sig.sign(signContext); // EXC
//Следующий этап — поместить узел ds:Signature и сертификат (X509Certificate) в узел wsse:Security,
//причём сертификат нужно удалить из ds:KeyInfo и оставить там ссылку на wsse:BinarySecurityToken с сертификатом:
// Узел подписи Signature.
Element sigE = (Element) XPathAPI.selectSingleNode(signContext.getParent(), "//ds:Signature");
// Блок данных KeyInfo.
Node keyE = XPathAPI.selectSingleNode(sigE, "//ds:KeyInfo", sigE);
// Элемент SenderCertificate, который должен содержать сертификат.
Element cerVal = (Element) XPathAPI.selectSingleNode(token, "//*[@wsu:Id='SenderCertificate']");
/*****-----*****/
Node certi = XPathAPI.selectSingleNode(sigE, "//ds:X509Certificate", sigE);
keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
Node str = keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference"));
Element strRef = (Element)str.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference"));
strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
strRef.setAttribute("URI", "http://eln.fss.ru/actor/mo/1025401011833");
header.getSecurityHeader().appendChild(sigE);
keyE = XPathAPI.selectSingleNode(sigE, "//wsse:Security", sigE);
Element strRef2 = (Element)keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wse:BinarySecurityToken"));
strRef2.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
strRef2.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
strRef2.setAttribute("wsu:Id", "http://eln.fss.ru/actor/mo/1025401011833");
strRef2.setTextContent(certi.getFirstChild().getNodeValue());
System.out.println("Подписанное сообщение готово.");
System.out.println("*****************");
CreateXml.SaveSOAPToXML("tempSign.xml", message);
return message;
}
После сообщение становиться таким: Код:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:end="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Header><wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/mo/OGRN_1025401011833" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><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="#OGRN_1025401011833"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><DigestValue>yevIWGLD7y1f8sgZvBB6hkAHt++aKki/107CV2vush4=</DigestValue></Reference></SignedInfo><SignatureValue>s1c1USX+aKN5UMOo4xrmMAACmNLz+xo4huo4WBfkV+/PBoXHU4UattTcPP55MkRXmKS/9IMOl7Oy
WdeaxOqlLg==</SignatureValue><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="http://eln.fss.ru/actor/mo/1025401011833" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></KeyInfo></Signature><wse:BinarySecurityToken xmlns:wse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="http://eln.fss.ru/actor/mo/1025401011833">MIIDkTCCA0CgAwIBAgITEgA4/fAC4SR8WI2UNQABADj98DAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3
DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cx
FzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVy
IDIwHhcNMTkwNzIzMDczNzQwWhcNMTkxMDIzMDc0NzQwWjCBljEgMB4GCSqGSIb3DQEJARYRcmV0
MTIzcmV0QG1haWwucnUxGTAXBgNVBAMMEFNoYXNoa292IEV2Z2VuaWkxCzAJBgNVBAsMAklUMQ8w
DQYDVQQKDAZLT01JQUMxFTATBgNVBAcMDE5vdm9rdXpuZXRzazEVMBMGA1UECAwMTm92b2t1em5l
dHNrMQswCQYDVQQGEwJSVTBmMB8GCCqFAwcBAQEBMBMGByqFAwICJAAGCCqFAwcBAQICA0MABECg
MYebqlT5Z/0xUFI6B2BQ/OrVH+PAApw+4MA+m35zBphmU6/XsHFQ7PiuXgbdA7yAYHQEenWvoT3P
BSph5WW0o4IBdjCCAXIwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1Ud
DgQWBBROTjX9G1CBPUbTZykKaBU89Ztn2DAfBgNVHSMEGDAWgBROgz4Uae/sXXqVK18R/jcyFklV
KzBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xs
L0NSWVBUTy1QUk8lMjBUZXN0JTIwQ2VudGVyJTIwMigxKS5jcmwwgawGCCsGAQUFBwEBBIGfMIGc
MGQGCCsGAQUFBzAChlhodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3Qt
Y2EtMjAxNF9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUyMDIoMSkuY3J0MDQGCCsGAQUFBzAB
hihodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMAgGBiqFAwICAwNBAKO3
xo+lLAp+6tbpTHiboyM4ZFJ4K+zZTRvV8nv61H3+hgrXAAWCSQi8TiBAMeKHeUmGz9JxJbn76zdL
cyrdDL0=</wse:BinarySecurityToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body Id="OGRN_1025401011833"><end:getNewLNNum><ogrn>1025401011833</ogrn></end:getNewLNNum></SOAP-ENV:Body></SOAP-ENV:Envelope>
|