java - 签名和加密策略

标签 java web-services jax-ws ws-security java-metro-framework

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

这是提供者文档对安全性的看法

Currently, we use the SOAP Message Security version 1.0 specification at http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf

This standard uses two other from W3C norm:
XMLENC (http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/)
and XMLDSIG (http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/)

For the signature, a “SecurityTokenReference” using a direct “reference” specifying “URI” and “valueType” of X509 is mandatory. For the enciphering, we recommend it too, but also we support in order of preference a reference to a keyIdentifier, a X509IssuerSerial or a keyName.

The enciphered and signed block has to be the “body” tag.

We recommend to use: “rsa-sha1” for signature, “rsa-1_5” for encrypting key and “tripledes-cbc” for encrypting body.

所以我想出了以下策略(从 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 向导,我无法在不使用寻址的情况下获得加密的 header 。这应该是可能的吗?

我用旧的 axis 1 类和 wss4j 破解了一些东西,它可以工作,但它很丑,我宁愿使用更适合 future 的东西。

最佳答案

你看起来确实很困惑。一般来说,你应该有一个单一的政策。在您的情况下,您冒着接受不安全的 Web 服务调用的风险,因为您有一个定义传输绑定(bind) (https) 的策略,而另一个则没有。

此外,由于您有传输绑定(bind),这意味着整个正文都将通过传输协议(protocol) (https) 加密。您不需要明确指定正文加密。事实上,此绑定(bind)将加密除 http header 之外的所有内容。

传输绑定(bind)确实是获得安全 Web 服务的最简单方法。如果你想要完全控制,你必须根据你的需要编写你自己的对称或非对称绑定(bind)。 Asymetric 更复杂,因为它需要双方都有证书,而 asymetric 只需要服务器证书(接受匿名客户端)。不对称和对称绑定(bind)需要小心。它们的设计非常灵活,可以让您设计任何策略,即使容易受到某些攻击。

当不使用传输绑定(bind)时,您必须指定主体必须加密。正如规范中所述:

sp:EncryptedParts/sp:Body

或者翻译成xml:

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

类似的,如果你想让正文被签名:

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

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

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

WS-SecurityPolicy specification是我为理解政策而阅读过的最有用的文档。你应该花时间仔细阅读这篇文章。它详细介绍了事情并包含有用的示例。最好阅读不同版本的文档,因为某些方面将在更新的版本中得到更好的记录。注意我链接了 v1.3。

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

一个可以帮助您快速制定政策的工具是 SoapUI .它并不完全支持我所需要的,但它帮助我学到了一些东西。它有一个很棒的用户界面,而且不是很难使用。

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

我发现政策非常复杂。准备好吸收大量概念!

关于java - 签名和加密策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10582229/

相关文章:

java - Swing - 如何处理多个相互依赖的组件?

ruby-on-rails - 测试构建在 RESTful Web 服务之上的应用程序

javascript - 使用 ISO V2 Coated 等颜色配置文件将 CMYK 颜色转换为 RGB?

java - 如何设置自定义 JAXBContext

java - WebLogic 10.3 中的 Web 服务部署问题

jaxb - 如何在JAX-WS客户端中重用服务器端类?

java - 如何同步多个线程写入文件

java - Swing - MaskFormatter - 从文本字段的右侧输入数字

java.sql.SQLRecoverableException - 从 jdbc 重新连接

java "Class file contains wrong class"错误