签名和加密策略

我需要实现一个jax-ws客户端。

以下是提供商文档对安全性的看法

目前,我们使用 SOAP 消息安全 1.0 版规范 http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf

该标准使用W3C规范中的另外两个标准:
XMLENC(http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/
和XMLDSIG(http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/)

对于签名,必须使用指定 X509 的“URI”和“valueType”的直接“引用”的“SecurityTokenReference”。对于加密,我们也建议使用它,但我们也支持按优先顺序引用keyIdentifier,X509IssuierSerial或keyName。

加密和签名的块必须是“body”标签。

我们建议使用:“rsa-sha1”表示签名,“rsa-1_5”用于加密密钥,“tripledes-cbc”用于加密正文。

因此,我想出了以下策略(由netbeans生成)。但。。。这对我来说看起来不对劲。Web服务尚不可访问,但我不确定规范版本是否匹配。我读了很多关于这个主题的文章,但我仍然有些困惑。此策略看起来还行吗?

<wsp1:Policy wsu:Id="ListeOperationsPeriodeSoapBindingSoapPolicy">
    <wsp1:ExactlyOne>
        <wsp1:All>
            <sp:TransportBinding>
                <wsp1:Policy>
                    <sp:TransportToken>
                        <wsp1:Policy>
                            <sp:HttpsToken RequireClientCertificate="false"/>
                        </wsp1:Policy>
                    </sp:TransportToken>
                    <sp:Layout>
                        <wsp1:Policy>
                            <sp:Lax/>
                        </wsp1:Policy>
                    </sp:Layout>
                    <sp:AlgorithmSuite>
                        <wsp1:Policy>
                            <sp:TripleDesRsa15/>
                        </wsp1:Policy>
                    </sp:AlgorithmSuite>
                </wsp1:Policy>
            </sp:TransportBinding>
            <sp:Wss10/>
            <sp:EndorsingSupportingTokens>
                <wsp1:Policy>
                    <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
                        <wsp1:Policy>
                            <sp:WssX509V3Token10/>
                        </wsp1:Policy>
                    </sp:X509Token>
                </wsp1:Policy>
            </sp:EndorsingSupportingTokens>

        </wsp1:All>
    </wsp1:ExactlyOne>
</wsp1:Policy>
<wsp:Policy wsu:Id="ListeOperationsPeriodeSoapBindingSoap_perform_Input_Policy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp1:SignedEncryptedSupportingTokens>
                <wsp:Policy>
                    <sp1:X509Token sp1:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                        <wsp:Policy>
                            <sp1:WssX509V3Token10/>
                        </wsp:Policy>
                    </sp1:X509Token>
                </wsp:Policy>
            </sp1:SignedEncryptedSupportingTokens>
        </wsp:All>
    </wsp:ExactlyOne>

</wsp:Policy>

编辑:我无法让它用wsit-yet发送预期的消息。例如,使用 Netbeans 向导,如果不使用寻址,我无法获得加密的标头。它应该是可能的吗?

我用一个旧的轴1类和wss4j破解了一些东西,它可以工作,但它很丑陋,我宁愿使用更面向未来的东西。


答案 1

你似乎确实很困惑。通常,您应该有一个策略。在您的情况下,您可能会接受不安全的 Web 服务调用,因为您有一个策略定义传输绑定 (https),而另一个策略则没有。

此外,由于您有传输绑定,这意味着整个正文将由传输协议 (https) 加密。无需显式指定正文加密。实际上,此绑定将加密除 http 标头之外的所有内容。

传输绑定确实是获取安全 Web 服务的最简单方法。如果要完全控制,则必须根据需要编写自己的对称或非对称绑定。不对称更复杂,因为它需要两端的证书,而不对称只需要服务器证书(接受匿名客户端)。不对称和对称结合需要小心。它们被设计为高度灵活,并允许您设计任何策略,即使容易受到某些攻击。

不使用传输绑定时,必须指定必须加密的正文。如规格中所述:

sp:EncryptedParts/sp:Body

或者翻译成 xml:

<sp:EncryptedParts>
  <sp:Body/>
</sp:EncryptedParts>

同样,如果您希望对正文进行签名:

<sp:SignedParts>
  <sp:Body/>
</sp:SignedParts>

还有更多选项可以指定签名/加密顺序,是否加密签名等。

顾名思义,sp:EndorsingSupportingToken 等策略适用于支持令牌。我熟悉的类型是可以包含在 Web 服务请求中的用户名令牌。

WS-SecurityPolicy 规范是我读过的用于理解策略的最有用的文档。您应该花时间仔细阅读本文。它很好地详细介绍了事情,并包含有用的示例。阅读不同版本的文档是件好事,因为某些方面将在更新的版本中更好地记录下来。注意:我链接了 v1.3。

设置 Web 服务客户端和服务器并编写简单的测试。特别是如果您不熟悉Web服务。

SoapUI是帮助您快速制定策略的一个工具。它并不完全支持我需要的东西,但它帮助我学习了一些东西。它有一个很棒的UI,使用起来并不难。

获取一些示例或构建一些示例,然后在规范的帮助下解构它们。

我发现政策相当复杂。准备好吸收很多概念!


答案 2

也许你想尝试使用CXF而不是WSIT?http://cxf.apache.org/docs/ws-security.html


推荐