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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline PashaTechnique  
#1 Оставлено : 25 июля 2019 г. 11:43:36(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Помогите пожалуйста подобрать подходящий механизм обработки XML документа.
Да и в целом может заметит кто-то ошибку какую-то.
Заранее благодарен.

Код:

     private static SOAPMessage createSoapRequest() throws Exception { 
		 
		 org.apache.xml.security.Init.init();
		 
		 KeyStore keyStore = KeyStore.getInstance("REGISTRY");
         keyStore.load(null, null);

         PrivateKey privateKey = (PrivateKey) keyStore.getKey("92848ffb8-045e-b4ba-6d47-d1507b6091f", "password".toCharArray());
         X509Certificate certificate = (X509Certificate) keyStore.getCertificate("92848ffb8-045e-b4ba-6d47-d1507b6091f");

         Signature signature = Signature.getInstance("GOST3411_2012_256withGOST3410DH_2012_256");  
         signature.initSign(privateKey);
        
		 MessageFactory messageFactory = MessageFactory.newInstance();
		 SOAPMessage soapMessage = messageFactory.createMessage();
		 SOAPPart soapPart = soapMessage.getSOAPPart();
    	 SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
    	 soapEnvelope.addNamespaceDeclaration("end", "http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl");
		 SOAPBody soapBody = soapEnvelope.getBody();
		 SOAPElement soapElement = soapBody.addChildElement("getNewLNNum", "end");
		 SOAPElement element1 = soapElement.addChildElement("ogrn");
		 element1.addTextNode("1025401011833");
		 soapMessage.saveChanges();
		 
		 soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
		 Document doc = soapMessage.getSOAPPart().getEnvelope().getOwnerDocument();
			
		//Добавляем заголовки для помещения информации о подписи:
		 WSSecHeader header = new WSSecHeader();
		 header.setActor("http://eln.fss.ru/actor/mo/1025401011833");
		 header.setMustUnderstand(false);
		 header.insertSecurityHeader(soapMessage.getSOAPPart().getEnvelope().getOwnerDocument());
		// Элемент подписи.
		 Element token = header.getSecurityHeader();
		 
		// Загрузка провайдера.
		 Provider xmlDSigProvider = new ru.CryptoPro.JCSP.JCSP();
		 
		//Добавляем описание преобразований над документом и узлом SignedInfo согласно методическим рекомендациям
		 
		 final Transforms transforms = new Transforms(doc);
		 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("#body", 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((X509Certificate) certificate));
		 KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
		 
		//Подписываем данные в элементе token:
		 javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki);
		 DOMSignContext signContext = new DOMSignContext((Key) privateKey, token);
		 sig.sign(signContext);
			
		 //Следующий этап — поместить узел 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']");
		  cerVal.setTextContent(XPathAPI.selectSingleNode(keyE, "//ds:X509Certificate", keyE).getFirstChild().getNodeValue());
		  
		 // Удаляем содержимое KeyInfo
			keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
			NodeList chl = keyE.getChildNodes();
			for (int i = 0; i < chl.getLength(); i++) {
			    keyE.removeChild(chl.item(i));
			}
			// Узел KeyInfo содержит указание на проверку подписи с помощью сертификата SenderCertificate.
			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", "#SenderCertificate");
			header.getSecurityHeader().appendChild(sigE);
		
			soapMessage.saveChanges();
			
		 System.out.println("----------SOAP Request------------");
		 soapMessage.writeTo(System.out);
		 
		 return soapMessage;
		 
	 }


Код:

июл 25, 2019 3:09:40 PM ru.CryptoPro.JCSP.MSCAPI.cl_6 enumInstalledProviders
WARNING: Provider with type of 24 not found.
июл 25, 2019 3:09:40 PM ru.CryptoPro.JCSP.MSCAPI.cl_6 enumInstalledProviders
WARNING: Provider with type of 24 not found.
июл 25, 2019 3:09:40 PM ru.CryptoPro.JCSP.Starter check
INFO: Loading JCSP 5.0.40055
июл 25, 2019 3:09:40 PM ru.CryptoPro.JCSP.Starter check
INFO: JCSP loaded.
javax.xml.crypto.NoSuchMechanismException: java.security.NoSuchAlgorithmException: no such algorithm: DOM for provider JCSP
	at javax.xml.crypto.dsig.XMLSignatureFactory.getInstance(XMLSignatureFactory.java:240)
	at start.StartApp.createSoapRequest(StartApp.java:99)
	at start.StartApp.main(StartApp.java:175)
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: DOM for provider JCSP
	at sun.security.jca.GetInstance.getService(GetInstance.java:101)
	at sun.security.jca.GetInstance.getInstance(GetInstance.java:218)
	at javax.xml.crypto.dsig.XMLSignatureFactory.getInstance(XMLSignatureFactory.java:238)
	... 2 more
Offline Евгений Афанасьев  
#2 Оставлено : 25 июля 2019 г. 11:51:44(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Тут ошибка:
Код:

// Загрузка провайдера.
Provider xmlDSigProvider = new ru.CryptoPro.JCSP.JCSP();
...
MLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);

JCSP не реализует DOM, его реализует XMLDSigRI провайдер, см. примеры, в них xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI() из XMLDSigRI.jar.

Отредактировано пользователем 25 июля 2019 г. 11:52:18(UTC)  | Причина: Не указана

Offline PashaTechnique  
#3 Оставлено : 25 июля 2019 г. 12:16:39(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Тут ошибка:
Код:

// Загрузка провайдера.
Provider xmlDSigProvider = new ru.CryptoPro.JCSP.JCSP();
...
MLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);

JCSP не реализует DOM, его реализует XMLDSigRI провайдер, см. примеры, в них xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI() из XMLDSigRI.jar.


А если вместо JCP используется провайдер CSP. Просто смена провайдера в данный момент привела к следующей ошибке:

Код:

java.security.KeyStoreException: REGISTRY not found
	at java.security.KeyStore.getInstance(KeyStore.java:851)
	at start.StartApp.createSoapRequest(StartApp.java:60)
	at start.StartApp.main(StartApp.java:174)
Caused by: java.security.NoSuchAlgorithmException: REGISTRY KeyStore not available
	at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
	at java.security.Security.getImpl(Security.java:695)
	at java.security.KeyStore.getInstance(KeyStore.java:848)
	... 2 more


Как я понимаю, это потому что сертификат выданный УЦ, находиться в хранилище REGISTRY провайдера CSP.
Использую провайдер JCP, сканируется хранилище HDImageStore. Могу ли я его как-то перенести туда ?
Offline two_oceans  
#4 Оставлено : 26 июля 2019 г. 7:53:20(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Цитата:
Да и в целом может заметит кто-то
Мелочь конечно, но чем больше кода, тем больше мест для ошибок. Немного непонятно почему сначала создаете узел X509Data, подписываете, берете из него SenderCertificate потом X509Data удаляете. Конструктор подписи не срабатывает если KeyInfo сразу с референсом на сертификат (а сертификат сразу в SenderCertificate)?

Отредактировано пользователем 26 июля 2019 г. 7:54:13(UTC)  | Причина: Не указана

Offline PashaTechnique  
#5 Оставлено : 26 июля 2019 г. 9:00:21(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Абсолютно согласен с вами, исправил вроде ваше замечание.

Автор: two_oceans Перейти к цитате
Цитата:
Да и в целом может заметит кто-то
Мелочь конечно, но чем больше кода, тем больше мест для ошибок. Немного непонятно почему сначала создаете узел X509Data, подписываете, берете из него SenderCertificate потом X509Data удаляете. Конструктор подписи не срабатывает если KeyInfo сразу с референсом на сертификат (а сертификат сразу в SenderCertificate)?


Дошел уже практически до конца но на ответе получаю почему-то следующее. И так по порядку.

Запрос:
Код:

<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"><SOAP-ENV:Header><wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/mo/1025401011833" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:BinarySecurityToken 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="OGRN_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=</wsse:BinarySecurityToken><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="#body"><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>mdvUPVEdSSzhK4GNjBJ1+20HJ9MYnjRFnDsq0qFEhcE=</DigestValue></Reference></SignedInfo><SignatureValue>ilcTSUY90oEybsnFF5MIQ4tK3fajEnej6Roo13AJhLvS395CPBDB7sx0LRAeHUc7rbFSltQBpgxV
osPUz0B9UA==</SignatureValue><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="OGRN_1025401011833" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></KeyInfo></Signature></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body wsu:Id="body"><end:getNewLNNum><ogrn>1025401011833</ogrn></end:getNewLNNum></SOAP-ENV:Body></SOAP-ENV:Envelope>


Метод создающий запрос:
Код:

private static SOAPMessage createSoapRequest() throws Exception { 
		 
		 
		 if(!JCPXMLDSigInit.isInitialized()) {
			    JCPXMLDSigInit.init(); // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
			}
		 
		 KeyStore keyStore = KeyStore.getInstance("HDImageStore");
         keyStore.load(null, null);

         PrivateKey privateKey = (PrivateKey) keyStore.getKey("92848ffb8-045e-b4ba-6d47-d1507b6091f - Copy", "password".toCharArray());
         X509Certificate certificate = (X509Certificate) keyStore.getCertificate("92848ffb8-045e-b4ba-6d47-d1507b6091f - Copy");
        
		 MessageFactory messageFactory = MessageFactory.newInstance();
		 SOAPMessage soapMessage = messageFactory.createMessage();
		 SOAPPart soapPart = soapMessage.getSOAPPart();
    	 SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
    	 soapEnvelope.addNamespaceDeclaration("end", "http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl");
		 SOAPBody soapBody = soapEnvelope.getBody();
		 SOAPElement soapElement = soapBody.addChildElement("getNewLNNum", "end");
		 SOAPElement element1 = soapElement.addChildElement("ogrn");
		 element1.addTextNode("1025401011833");
		 soapMessage.saveChanges();
		 
		 soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsse",
	                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
		 soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
		 soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds","http://www.w3.org/2000/09/xmldsig#");
		 soapMessage.getSOAPBody().setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
	                "wsu:Id", "body");

			
	        
	        // Формируем заголовок.
	        WSSecHeader header = new WSSecHeader();
	        header.setActor("http://eln.fss.ru/actor/mo/1025401011833");        				 
	        header.setMustUnderstand(false);
	        
	        // Получаем документ.
	        Document doc = soapMessage.getSOAPPart().getEnvelope().getOwnerDocument();
	        Element secHeader = header.insertSecurityHeader(soapMessage.getSOAPPart().getEnvelope().getOwnerDocument());
	        Element token = header.getSecurityHeader();
	        
	        NodeList list = secHeader.getElementsByTagName("wsse:BinarySecurityToken");
	        Element binSecToken = null;
	        
	        if (list.getLength()!=0){
	        	binSecToken = (Element) list.item(0); 
	        }else{
	        	binSecToken = (Element) header.getSecurityHeader().appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","wsse:BinarySecurityToken"));
	        }
	        
	        binSecToken.setAttribute("wsu:Id", "OGRN_1025401011833");
	        binSecToken.setAttribute(
					"EncodingType",
					"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
	        binSecToken.setAttribute(
					"ValueType",
					"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
	        		
	        /*** Подпись данных ***/

	        // Загрузка провайдера.
	        Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();

	        // Преобразования над документом.
	        final Transforms transforms = new Transforms(doc);
	        transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);

	        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);

	        // Преобразования над блоком SignedInfo
	        List<Transform> transformList = new ArrayList<Transform>();
	        Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
	        transformList.add(transformC14N);

	        // Ссылка на подписываемые данные.
	        Reference ref = fac.newReference("#body",
	            fac.newDigestMethod("urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256", null),
	            transformList, null, null);

	        // Блок SignedInfo.
	        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));

	        // Блок KeyInfo.
	        KeyInfoFactory kif = fac.getKeyInfoFactory();
	        X509Data x509d = kif.newX509Data(Collections.singletonList(certificate));
	        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
			 
	        // Подпись данных.
	        javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki);
	        DOMSignContext signContext = new DOMSignContext((Key)privateKey, token);
	        sig.sign(signContext);

	        // Блок подписи Signature.
	        Element sigE = (Element) XPathAPI.selectSingleNode(signContext.getParent(), "//ds:Signature");
	        // Блок данных KeyInfo.
	        Node keyE = XPathAPI.selectSingleNode(sigE, "//ds:KeyInfo", sigE);
	        
	        // Элемент SenderCertificate, который должен содержать сертификат.
			list = secHeader.getElementsByTagName("wsse:BinarySecurityToken");
	        Element cerVal = (Element)list.item(0);
	        
	        //Element cerVal = (Element) XPathAPI.selectSingleNode(token, "//*[@wsu:Id='SenderCertificate']");
	        cerVal.setTextContent(XPathAPI.selectSingleNode(keyE, "//ds:X509Certificate", keyE).getFirstChild().getNodeValue());

	        // Удаляем элементы KeyInfo, попавшие в тело документа. Они должны быть только в header.
	        keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));

	        NodeList chl = keyE.getChildNodes();

	        for (int i = 0; i < chl.getLength(); i++) {
	            keyE.removeChild(chl.item(i));
	        }

	        // Блок KeyInfo содержит указание на проверку подписи с помощью сертификата SenderCertificate.
	        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", "OGRN_1025401011833");
	        header.getSecurityHeader().appendChild(sigE);
		
			soapMessage.saveChanges();
			
		 System.out.println("----------SOAP Request------------");
		 soapMessage.writeTo(System.out);
		 
		 return soapMessage;
		 
	 }


Ответ:
Код:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>S:Server</faultcode>
         <faultstring>ru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: Сообщение не соответствует формату XML Encryption.  Обратитесь к разработчику программного обеспечения, на котором осуществлялось шифрование данных. Cообщите следующую информацию: Отсутствует элемент EncryptedData class ru.ibs.cryptopro.jcp.eln.crypt.CryptoException</faultstring>
      </S:Fault>
   </S:Body>
</S:Envelope>
Offline PashaTechnique  
#6 Оставлено : 26 июля 2019 г. 9:03:10(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Абсолютно с вами согласен, исправил ваше замечание.

Автор: two_oceans Перейти к цитате
Цитата:
Да и в целом может заметит кто-то
Мелочь конечно, но чем больше кода, тем больше мест для ошибок. Немного непонятно почему сначала создаете узел X509Data, подписываете, берете из него SenderCertificate потом X509Data удаляете. Конструктор подписи не срабатывает если KeyInfo сразу с референсом на сертификат (а сертификат сразу в SenderCertificate)?


Уже на пути к концу. И так по порядку:

Запрос:
Код:

<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"><SOAP-ENV:Header><wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/mo/1025401011833" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:BinarySecurityToken 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="OGRN_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=</wsse:BinarySecurityToken><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="#body"><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>mdvUPVEdSSzhK4GNjBJ1+20HJ9MYnjRFnDsq0qFEhcE=</DigestValue></Reference></SignedInfo><SignatureValue>ilcTSUY90oEybsnFF5MIQ4tK3fajEnej6Roo13AJhLvS395CPBDB7sx0LRAeHUc7rbFSltQBpgxV
osPUz0B9UA==</SignatureValue><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="OGRN_1025401011833" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></KeyInfo></Signature></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body wsu:Id="body"><end:getNewLNNum><ogrn>1025401011833</ogrn></end:getNewLNNum></SOAP-ENV:Body></SOAP-ENV:Envelope>


Ответ:
Код:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>S:Server</faultcode>
         <faultstring>ru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: Сообщение не соответствует формату XML Encryption.  Обратитесь к разработчику программного обеспечения, на котором осуществлялось шифрование данных. Cообщите следующую информацию: Отсутствует элемент EncryptedData class ru.ibs.cryptopro.jcp.eln.crypt.CryptoException</faultstring>
      </S:Fault>
   </S:Body>
</S:Envelope>


Вроде обращаюсь к разработчикам =)
Offline Евгений Афанасьев  
#7 Оставлено : 26 июля 2019 г. 9:45:14(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Предполагаю, ответ в тексте ошибки:
ru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: Сообщение не соответствует формату XML Encryption. Обратитесь к разработчику программного обеспечения, на котором осуществлялось шифрование данных. Cообщите следующую информацию: Отсутствует элемент EncryptedData
Вероятно, должно быть быть зашифрованное сообщение, а не подписанное.
Offline two_oceans  
#8 Оставлено : 26 июля 2019 г. 9:54:27(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Во-первых, в референсе на BinarySecurityToken в значении URI должна быть сначала решетка, это касается всех URI ссылающихся на ID в текущем документе. Значения ID можно называть как удобно, но первой не может идти цифра, начинается с буквы или некоторых спецсимволов.
Код:
...<wsse:Reference URI="#OGRN_1025401011833" ...

Во-вторых, ФСС в ошибке требует шифрованного сообщения, а у Вас только подписанное пока, но еще не зашифрованное. Поэтому "устраивайтесь поудобнее", путь не такой близкий. В общих чертах: полученный подписанный XML нужно передать на шифрование, результат шифрования закодировать в Base64 и соорудить еще один XML (тот самый XML Encryption), в котором будет информация об обмене ключами и закодированный подписанный XML.
Offline PashaTechnique  
#9 Оставлено : 26 июля 2019 г. 10:15:31(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: two_oceans Перейти к цитате
Во-первых, в референсе на BinarySecurityToken в значении URI должна быть сначала решетка, это касается всех URI ссылающихся на ID в текущем документе. Значения ID можно называть как удобно, но первой не может идти цифра, начинается с буквы или некоторых спецсимволов.
Код:
...<wsse:Reference URI="#OGRN_1025401011833" ...

Во-вторых, ФСС в ошибке требует шифрованного сообщения, а у Вас только подписанное пока, но еще не зашифрованное. Поэтому "устраивайтесь поудобнее", путь не такой близкий. В общих чертах: полученный подписанный XML нужно передать на шифрование, результат шифрования закодировать в Base64 и соорудить еще один XML (тот самый XML Encryption), в котором будет информация об обмене ключами и закодированный подписанный XML.


URI="#OGRN_1025401011833" , если мои глаза мне не врут, сначала идет как раз таки символ решетки "#", а потом не цифра, а буква "О". Немного не понятно ваше замечание по этому поводу.

Да уже устроились как нужно, в документах ЖТЯИ искать недостающую информацию? Если честно даже не видел где находиться папка примеров sample-source, которую здесь все рьяно расхваливают, не подскажите ее местоположение?
Offline PashaTechnique  
#10 Оставлено : 26 июля 2019 г. 10:19:13(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Код:
 soapMessage.getSOAPBody().setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
	                "wsu:Id", "body");


Не понятно почему когда я меняю значение атрибута "body", на любое другое, появляется NullPointer, с чем это связанно ?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.