Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Signature API / 4 сообщений из 4, страница 1 из 1
21.11.2012, 11:44:31
    #38046622
alee33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Signature API
Формирую подпись соап запроса через апи

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

<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
21.11.2012, 13:22:32
    #38046870
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Signature API
Привередливый у вас сервер, однако. А через DOM или XSLT просто внести изменения в готовый XML не пробовали?
...
Рейтинг: 0 / 0
21.11.2012, 13:23:41
    #38046877
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Signature API
Покажите ваш код. Signature API, вроде вокруг DOM и крутится. Создать тэги, а потом исправить сами элементы нельзя, разве?
...
Рейтинг: 0 / 0
21.11.2012, 14:14:03
    #38046985
alee33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Signature API
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Signature API / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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