powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Signature API
4 сообщений из 4, страница 1 из 1
Signature API
    #38046622
alee33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Формирую подпись соап запроса через апи

При формировании подписи генерится структура типа :

<Signature xmlns=" http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
...

А сервис требует ,чтоб у элемента <Signature> было другое пространство имен , т.е. в результате должно получиться :

<Signature>
<SignedInfo xmlns=" http://www.w3.org/2000/09/xmldsig#">
...

Есть методы, позволяющие установить namespace для <Signature> до генерации подписи? Что-то ничего найти не могу такого
Пробовала создавать <Signature> без ns и копировать туда сформированные дочерние элементы, но подпись ломается.


Максимум какой получился валидный вариант:
<Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
...

Но, судя по ответу сервера ,он не равнозначен <Signature><SignedInfo xmlns=" http://www.w3.org/2000/09/xmldsig#"> :(

Кто сталкивался ,кто знает?
...
Рейтинг: 0 / 0
Signature API
    #38046870
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привередливый у вас сервер, однако. А через DOM или XSLT просто внести изменения в готовый XML не пробовали?
...
Рейтинг: 0 / 0
Signature API
    #38046877
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите ваш код. Signature API, вроде вокруг DOM и крутится. Создать тэги, а потом исправить сами элементы нельзя, разве?
...
Рейтинг: 0 / 0
Signature API
    #38046985
alee33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Код примерно такой . Т.е. я формирую подпись ,потом создаю элемент Signature с нужным ns и перебрасываю туда деток .
В таком варианте как в примере- все валидно ,но сервер такой запрос не ест.
Если убрать префикс ds - то внешно получается что надо, но не валидируется

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
   private Document SignDOMDocument(Document doc, String type , String blockId ) throws Exception{
	    
    	com.sun.org.apache.xml.internal.security.Init.init();
   		org.apache.xml.security.Init.init();
   		
		XMLSignatureFactory fac = getSigFactory();
		        
        //Преобразования над узлом ds:SignedInfo:
        List<Transform> transformList = new ArrayList<Transform>();
		
        Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
        Transform transform = fac.newTransform(Transform.ENVELOPED, (XMLStructure) null);
       
	    transformList.add(transform);
	    transformList.add(transformC14N);

        
        //Добавляем ссылку на подписываемый узел с идентификатором
    	Reference refData = fac.newReference("#"+blockId, fac.newDigestMethod(getDigestMethod(), null),transformList, null, null);
    	
         //Задаём алгоритм подписи:      
       	SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,
       			(C14NMethodParameterSpec) null), fac.newSignatureMethod(getSignatureMethod(), null)  , Collections.singletonList(refData));
       	//Создаём узел ds:KeyInfo с информацией о сертификате:
     
       	KeyInfoFactory kif = fac.getKeyInfoFactory();
       	X509Data x509d = kif.newX509Data(Collections.singletonList((X509Certificate) getCert()));
       	KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
   
       	
       	javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki);
       	DOMSignContext signContext=null;
    		
       	            		
       Element dt= (Element) XPathAPI.selectSingleNode(doc.getDocumentElement(), "//*[@wsu:Id='"+blockId+"']"); //подписываемый элемент
       Element elDataParent =  (Element)dt.getParentNode(); //родительский элемент, помещаем туда подпись
       		
       signContext = new DOMSignContext((Key) getPrivateKey(), elDataParent);   
       		
       signContext.putNamespacePrefix(XMLSignature.XMLNS, "ds");
       sig.sign(signContext);//создаем подпись
	   
       		 //исходный элемент с сигнатурой
       Element sig1=(Element)XPathAPI.selectSingleNode( elDataParent, "//ds:Signature");
             //новый элемент
	   Element s= doc.createElementNS("http://asur.mos.ru/isi/declarants/v8", "Signature");
       		s.setAttribute("xmlns:ds",XMLSignature.XMLNS);
       		//s.setAttribute("xmlns", "http://asur.mos.ru/isi/declarants/v8");
			
       		//перебрасываем деток
       NodeList chl = sig1.getChildNodes();
   		int n=chl.getLength();
   		System.out.println("node count "+n);
   		for (int i = n-1; i >= 0; i--){
     		System.out.println(i+" "+chl.item(i).getNodeName());
   			s.appendChild(chl.item(i));
   		}
     
       	elDataParent.removeChild(sig1);
    	elDataParent.appendChild(s);
    
    //System.out.println(Utils.getResultString(doc,"UTF-8"));
        
        return doc;
       
    }
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Signature API
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]