如何使用WSS4j将SecurityTokenReference中的KeyIdentifier设置为Assertion ID

时间:2017-11-08 16:32:57

标签: soap cxf saml-2.0 wss4j

我有点像WSS4J的Noob所以我希望我错过了一些简单的东西。我正在尝试使用WSS4j和CXF为出站SOAP消息创建Security头。根据要求,必须签署断言和时间戳。断言在SAMLCallback和带有WSS4JOutInterceptor属性的Timestamp中完成。所有这一切都是直截了当的。该挂钩不是在签名中嵌入时间戳签名的KeyInfo信息,而是需要引用断言,其中包含KeyInfo的签名。因此,时间戳的KeyInfo的签名应如下所示:

            <ds:KeyInfo>
                <wsse:SecurityTokenReference TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0">
                    <wsse:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">3a4edd62-458e-4c3f-adc0-a9b505cb6284</wsse:KeyIdentifier>
                </wsse:SecurityTokenReference>
            </ds:KeyInfo>

注意KeyIdentifier如何指向和ID,这是断言的ID。我已经为WSS4JOutInterceptor尝试了所有不同的WSHandlerConstants.SIG_KEY_ID选项,但是所有这些选项都使用证书中的信息填充KeyInfo元素。我希望在WSS4J框架中有一些直接的解决方案。否则我正在编写一个拦截器来破解SOAP头。

提前致谢。

1 个答案:

答案 0 :(得分:0)

是的,可以,这是我向CXF推送的测试,以展示如何做到这一点:

https://github.com/apache/cxf/commit/5504cad08be5f2eb8396410618da68cb732b80e0