Java 如何猜测rampart中具有WS-Security响应的项的顺序?
我的axis2+rampart客户端使用了一些WS-Secured服务器。它在服务器升级后停止工作(JBoss升级,WSDL中有一些更改,但测试函数中没有)。服务器所有者声称其WS-Security配置未更改,但现在我的客户端报告:Java 如何猜测rampart中具有WS-Security响应的项的顺序?,java,axis2,webservice-client,ws-security,rampart,Java,Axis2,Webservice Client,Ws Security,Rampart,我的axis2+rampart客户端使用了一些WS-Secured服务器。它在服务器升级后停止工作(JBoss升级,WSDL中有一些更改,但测试函数中没有)。服务器所有者声称其WS-Security配置未更改,但现在我的客户端报告: org.apache.axis2.AxisFault: Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurit
org.apache.axis2.AxisFault: Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security
早些时候,当axis2.xml
中的“items”顺序不好时,我遇到了这个异常。
我所要做的就是把这些东西组合起来。它们看起来像:
<parameter name="InflowSecurity">
<action>
<items>Signature Encrypt Timestamp</items>
...
签名加密时间戳
...
现在这个问题又出现了。我看到,作为回应,没有“时间戳”。我从项目中删除了它,但没有任何更改
答复如下:
<soap:Envelope xmlns:soap="..."
xmlns:xenc="...">
<soap:Header>
<wsse:Security
xmlns:wsse="..."
soap:mustUnderstand="1">
<xenc:EncryptedKey xmlns:xenc="..."
Id="EncKeyId-B8B3555394366F3F0112919826983351032">
<xenc:EncryptionMethod Algorithm="..." />
<ds:KeyInfo xmlns:ds="...">
<wsse:SecurityTokenReference
xmlns:wsse="...">
<wsse:KeyIdentifier
...
</wsse:KeyIdentifier>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>
...
</xenc:CipherValue>
</xenc:CipherData>
<xenc:ReferenceList>
<xenc:DataReference URI="#EncDataId-624" />
</xenc:ReferenceList>
</xenc:EncryptedKey>
<ds:Signature xmlns:ds="..."
Id="Signature-622">
<ds:SignedInfo>
<ds:CanonicalizationMethod
Algorithm="..." />
<ds:SignatureMethod Algorithm="..." />
<ds:Reference URI="#id-623">
<ds:Transforms>
<ds:Transform Algorithm="..." />
</ds:Transforms>
<ds:DigestMethod Algorithm="..." />
<ds:DigestValue>
...
</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
...
</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-B8B3555394366F3F0112919826983181029">
<wsse:SecurityTokenReference
xmlns:wsse="..."
xmlns:wsu="..."
wsu:Id="STRId-B8B3555394366F3F0112919826983181030">
<wsse:KeyIdentifier
EncodingType="..."
ValueType="...">
...
</wsse:KeyIdentifier>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:ns1="..."
xmlns:wsu="..."
wsu:Id="id-623">
<xenc:EncryptedData xmlns:xenc="..."
Id="EncDataId-624" Type="...">
<xenc:EncryptionMethod Algorithm="..." />
<ds:KeyInfo xmlns:ds="...">
<wsse:SecurityTokenReference
xmlns:wsse="...">
<wsse:Reference
xmlns:wsse="..."
URI="#EncKeyId-B8B3555394366F3F0112919826983351032" />
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>
...
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</soap:Body>
</soap:Envelope>
这是一个老生常谈的问题,但当我刚刚结束在痛苦之地的旅程时,我将分享答案
a) 项目顺序由底层wss4j库而不是rampart强制执行。有问题的方法是org.apache.ws.security.handler.WSHandler中的checkReceiverResults()。使用rampart WSDoAllReceiver扩展WSHandler可能会遇到问题
b) 好消息是checkReceiverResults()方法受到保护。因此,您可以扩展WSDoAllReceiver并重写该方法,使其更具权限。我建议查看wss4j-1.5.8中添加到WSHandler的checkReceiverResultsAnyOrder()实现
因此,要回答您的问题:
您可以调试checkReceiverResults()方法,以查找并“修复”axis2.xml文件中项目的顺序。但这不是一个好办法,因为头的顺序可能总是会改变(SOAP头中不需要元素的顺序)。所以我的建议是调用checkReceiverResultsAnyOrder()而不是checkReceiverResults()。这是一个相当古老的问题,但当我刚刚完成了这片痛苦之地的旅程时,我将分享答案
a) 项目顺序由底层wss4j库而不是rampart强制执行。有问题的方法是org.apache.ws.security.handler.WSHandler中的checkReceiverResults()。使用rampart WSDoAllReceiver扩展WSHandler可能会遇到问题
b) 好消息是checkReceiverResults()方法受到保护。因此,您可以扩展WSDoAllReceiver并重写该方法,使其更具权限。我建议查看wss4j-1.5.8中添加到WSHandler的checkReceiverResultsAnyOrder()实现
因此,要回答您的问题:
您可以调试checkReceiverResults()方法,以查找并“修复”axis2.xml文件中项目的顺序。但这不是一个好办法,因为头的顺序可能总是会改变(SOAP头中不需要元素的顺序)。所以我的建议是调用checkReceiverResultsAnyOrder()而不是checkReceiverResults()