2010-05-03 20 views
2

全部, 我(仍)正在从Java/Metro 2.0调用WSE 3.0 .NET Web服务。我们已经设置了安全性要求,以便我们正在对正文&的标头&进行加密。我可以向他们的服务发送请求&获得响应,但Metro无法验证签名&从WSIT代码中引发错误。我从CVS &最新WSIT代码以下是方法的代码片段多数民众赞成炸掉:Metro&StreamBuffer命名空间错误 - 我是否正确理解这一点?

从com.sun.xml.ws.security.opt.impl.incoming.GenericSecuredHeader:

private XMLStreamBuffer completeHeader; 
public void writeTo(XMLStreamWriter w) throws XMLStreamException { 
     try { 
      // TODO what about in-scope namespaces 
      completeHeader.writeToXMLStreamWriter(w); 
     } catch (Exception e) { 
      throw new XMLStreamException(e); 
     } 
    } 

正如你所看到的,那里有一个TODO,我认为这个方法不能处理我所遇到的情况,但我不确定我是否知道他们的'范围内'命名空间是什么意思。

下面是来自web服务的响应XML的片段,它打破上:

<wsa:Action wsu:Id="Id-46282a5d-c7fa-403c-8ac9-f7df0dfdb0cf"> 
http://someAction</wsa:Action> 
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
<SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" /> 
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 

<Reference URI="#Id-46282a5d-c7fa-403c-8ac9-f7df0dfdb0cf"> 
<Transforms> 
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
</Transforms> 
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
<DigestValue> 
/2ivNKDpYSLqPWHzrSxN/RuZ/e8=</DigestValue> 
</Reference> 

在堆栈跟踪(包含下面),它抱怨不能够验证参考URI =“# ID-46282a5d-c7fa-403C-8ac9-f7df0dfdb0cf”。 我不清楚的是 - 它失败,因为Reference元素没有名称空间属性或前缀?应该允许它们从父Signature元素继承名称空间,还是StreamBuffer类不能处理它?

为了对比,这里是从我的请求(由WSIT产生),其中双链前缀是

XMLNS类似XML片段:DS =“http://www.w3.org/2000/09/ xmldsig#“

<ds:Signature xmlns:ns10="http://www.w3.org/2003/05/soap-envelope" 
xmlns:ns11="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" 
xmlns:ns12="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity" Id="_1"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
<exc14n:InclusiveNamespaces PrefixList="wsse S"/> 
</ds:CanonicalizationMethod> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 

<ds:Reference URI="#_5002"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
<exc14n:InclusiveNamespaces PrefixList="S"/> 
</ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<ds:DigestValue> 
vtf9n+OcI1nT0exavD4/ZQy6jm8=</ds:DigestValue> 
</ds:Reference> 

当Metro生成这些块时,每件事都有一个名称空间前缀。

如果你还在读这么远 - 谢谢!以下是堆栈跟踪中的一些片段:

Error occurred while trying to cache START_ELEMENTcom.sun.xml.stream.buffer.stax 
.StreamReaderBufferProcessor$InternalNamespaceContext 
[16:12:54.026] WSS1759: Following error null occured while performing canonicali 
zation null 
[16:12:54.026] javax.xml.stream.XMLStreamException 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.GenericSecuredHeade 
r.writeTo(GenericSecuredHeader.java:303) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.StreamWriterData.wr 
ite(StreamWriterData.java:101) 
[16:12:54.026] at com.sun.xml.ws.security.opt.crypto.dsig.Exc14nCanonicalizer.t 
ransform(Exc14nCanonicalizer.java:153) 
[16:12:54.026] at com.sun.xml.ws.security.opt.crypto.dsig.Transform.transform(T 
ransform.java:182) 
[16:12:54.026] at com.sun.xml.ws.security.opt.crypto.dsig.Reference.transform(R 
eference.java:183) 
[16:12:54.026] at com.sun.xml.ws.security.opt.crypto.dsig.Reference.validate(Re 
ference.java:102) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.processor.SignedInf 
oProcessor.processReference(SignedInfoProcessor.java:422) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.processor.SignedInf 
oProcessor.processReferences(SignedInfoProcessor.java:385) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.processor.SignedInf 
oProcessor.process(SignedInfoProcessor.java:189) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.Signature.process(S 
ignature.java:206) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.h 
andleSecurityHeader(SecurityRecipient.java:466) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.c 
acheHeaders(SecurityRecipient.java:281) 
[16:12:54.026] at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.v 
alidateMessage(SecurityRecipient.java:223) 
[16:12:54.026] at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.verifyInboundMess 
age(SecurityTubeBase.java:462) 
[16:12:54.026] at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRe 
sponsePacket(SecurityClientTube.java:412) 
[16:12:54.026] at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processResponse 


javax.xml.ws.WebServiceException: com.sun.xml.wss.impl.WssSoapFaultException: WSS1722: Error occurred while validating Reference with URI: #Id-46282a5d-c7fa-403c-8ac9-f7df0dfdb0c 
f 

回答

0

在做了一些更多的研究之后,我相信我对此的最初理解是正确的。调用StreamBuffer代码以从SOAP响应中流式传输XML的Metro/WSIT代码无法处理那些没有名称空间前缀或属性的元素。我已经提交的问题对WSIT,对于那些在后续有兴趣:

https://wsit.dev.java.net/issues/show_bug.cgi?id=1423

+0

你能给我关于这个问题的解决? [请检查此链接](http://stackoverflow.com/questions/28696160/error-while-serializing-timestamp-element-occured-while-performing-canonicalizat) – 2015-02-27 11:53:17