Java 如何猜测rampart中具有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

我的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-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()