使用jaxws-maven-plugin进行WS-Security加密的Webservice客户端

时间:2017-02-19 23:25:15

标签: java web-services jax-ws ws-security jaxws-maven-plugin

我只使用 jaxws-maven-plugin (没有Spring或任何其他库)从WSDL生成我的web服务客户端类,除了工作正常我需要使用WS-Security来加密我的请求的特定子元素

您能指点我任何文档或者给我一个如何配置它的提示吗?是否有配置文件,我在哪里设置以下内容?或者我是否需要使用其他库,如Apache CXF?

  

WS-A版本:200508

     

密钥标识符类型:二进制安全令牌

     

对称编码算法:AES256-CBC

     

密钥加密算法:RSA-OAEP-MGF1P

     

算法套件:Basic256Sha256

     

加密元素XPath:// xxx / yyy

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了什么:(注意我还是不明白发生了什么)

  • Wildfly以某种方式使用内置的Apache CXF(Glassfish实现和配置不同)
  • 我不得不修改提供的WSDL以添加WS-Policy(没有找到一种方法如何将其添加到外部文件或某处而不修改WSDL - 我不是作者) - 见下文
  • 必须提供密钥库
  • 并配置对它的访问权限:

    XxxService service = new XxxService();
    BindingProvider bp = (BindingProvider) service.getXxxPort();
    final Map<String, Object> rqc = bp.getRequestContext();
    
    Properties p = new Properties();
    p.setProperty("org.apache.ws.security.crypto.merlin.keystore.file", ...);
    p.setProperty("org.apache.ws.security.crypto.merlin.keystore.password", ...);
    p.setProperty("org.apache.ws.security.crypto.merlin.keystore.type", ...);
    p.setProperty("org.apache.ws.security.crypto.merlin.keystore.alias", ...);
    
    rqc.put("security.signature.properties", p);
    rqc.put("security.encryption.properties", p);
    

WSDL示例

 <?xml version="1.0" encoding="UTF-8"?>
 <wsdl:definitions ... >

...

<wsdl:binding name="..." type="...">
    <wsaw:UsingAddressing wsdl:required="false" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" />
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />

            <!-- added to wsdl for encryption -->
            <wsp:PolicyReference URI="#general_policy" />

    <wsdl:operation name="xxx">
        <wsdlsoap:operation soapAction="" />
        <wsdl:input name="...">
                            <!-- added to wsdl for encryption -->
                            <wsp:PolicyReference URI="#xxx_policy" />
            <wsdlsoap:body use="literal" />
        </wsdl:input>
        <wsdl:output ... >
    </wsdl:operation>

</wsdl:binding>



    <!-- added to wsdl for encryption -->

    <wsp:Policy wsu:Id="general_policy"
                xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
                xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
                xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <wsp:ExactlyOne>
            <wsp:Policy>
                <wsp:All>
                    <sp:AsymmetricBinding>
                        <wsp:Policy>
                            <sp:InitiatorToken>
                                <wsp:Policy>
                                    <sp:X509Token
                                        sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never">
                                        <wsp:Policy>
                                            <sp:WssX509V3Token10/>
                                        </wsp:Policy>
                                    </sp:X509Token>
                                </wsp:Policy>
                            </sp:InitiatorToken>
                            <sp:RecipientToken>
                                <wsp:Policy>
                                    <sp:X509Token
                                        sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never">
                                        <wsp:Policy>
                                            <sp:WssX509V3Token10/>
                                        </wsp:Policy>
                                    </sp:X509Token>
                                </wsp:Policy>                               
                            </sp:RecipientToken>
                            <sp:Layout>
                                <wsp:Policy>
                                    <sp:Strict />
                                </wsp:Policy>
                            </sp:Layout>
                            <sp:AlgorithmSuite>
                                <wsp:Policy>
                                    <sp:Basic256/>
                                </wsp:Policy>
                            </sp:AlgorithmSuite>
                        </wsp:Policy>
                    </sp:AsymmetricBinding>
                </wsp:All>
            </wsp:Policy>
        </wsp:ExactlyOne>
    </wsp:Policy>


    <wsp:Policy wsu:Id="xxx_policy">
        <wsp:ExactlyOne>
            <wsp:All>
                <sp:ContentEncryptedElements
                    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                    <sp:XPath>/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Body']/*[namespace-uri()='xxx' and local-name()='xxxRequest']/yyy</sp:XPath>
                </sp:ContentEncryptedElements>
            </wsp:All>
        </wsp:ExactlyOne>
    </wsp:Policy>
</wsdl:definitions>