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

How to set the KeyIdentifier in the SecurityTokenReference to the Assertion ID with WSS4j

我对 WSS4J 有点菜鸟,所以我希望我遗漏了一些简单的东西。我正在尝试使用 WSS4j 和 CXF 为出站 SOAP 消息创建安全 header。根据要求,必须签署断言和时间戳。断言在 SAMLCallback 中完成,时间戳具有 WSS4JOutInterceptor 的属性。所有这些都是直截了当的。问题不是在签名中嵌入时间戳签名的 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 header。

提前致谢。

是的,这是可能的,这是我推送到 CXF 的测试以展示如何完成:

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