我正在使用CXF构建一个客户端SOAP WS,我有一个问题,我需要在请求操作中只加密一个字段。我做了一些测试 使用SOAPUI,我加载了X.509证书并创建了一个传出的WS-Security配置并选择了一个特定的字段来加密,并且WS调用没问题。但是使用CXF,我不知道如何实现。我阅读了一些关于主题的文章,并使用xml CXF配置,但我还没有找到如何加密SOAP请求的特定字段。例如,我需要加密请求如下:
<appSettings>
<addkey="WinDSS_Connection"value="DRIVER=SoftVelocityTopspeeddriver(*.tps);DBQ=T:\Rambo\Store231WinDss\windss\DATA;Extension=tps;Oem=N;NullEmptyStr=N;"/>
</appSettings>
一些建议或意见,我认为它可以用作拦截器,但是拦截器只能是加密的值字段而没有在原始SOAP中使用的命名空间。
答案 0 :(得分:1)
在CXF中,您使用WSS4J进行加密。对于客户端,您将使用WSS4JOutInterceptor。可以找到如何使用它的示例here。
要指定邮件的哪一部分应加密,则有一个属性WsHandlerConstants.ENCRYPTION_PARTS。以下是JavaDoc的简短摘录:
用于定义请求的哪些部分应加密的参数。
此参数的值是分号分隔元素的列表 标识要加密的元素的名称。加密模式 说明符和命名空间标识,每个都在一对卷曲中 括号,可以在每个元素名称之前。
加密模式说明符是{Content}或{Element}。请 请参阅有关差异的W3C XML加密规范 元素和内容加密之间。加密模式默认 如果省略则为内容。列表示例:
&lt; parameter name =&#34; encryptionParts&#34;
值=&#34; {内容} {http://example.org/paymentv2}信用卡式; {元素} {}用户名&#34; /&GT;
如果你使用javabased配置,它将是
outProps.put(WSHandlerConstants.ENCRYPTION_PARTS, "{Content}{http://example.org/paymentv2}CreditCard;{Element}{}UserName");