我目前正在研究WS-Security并使用CXF构建一个带有签名和加密操作的基本示例。我设置客户端和服务器分别对请求和响应进行签名和加密。
我使用Spring配置服务器。这是配置:
<context:component-scan base-package="com.jfjp.ws" />
<bean id="passwordCallback" class="com.jfjp.ws.service.ServerPasswordCallback" />
<jaxws:endpoint id="greetServiceWS" implementor="#greetService" address="/Greeting">
<jaxws:inInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken Signature Encrypt"/>
<entry key="signaturePropFile" value="server_signverf.properties"/>
<entry key="decryptionPropFile" value="server_decrypt.properties"/>
<entry key="encryptionKeyIdentifier" value="password"/>
<entry key="passwordCallbackRef">
<ref bean="passwordCallback"/>
</entry>
</map>
</constructor-arg>
</bean>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="Signature Encrypt"/>
<entry key="user" value="server"/>
<entry key="signaturePropFile" value="server_sign.properties"/>
<entry key="encryptionPropFile" value="server_encrypt.properties"/>
<entry key="encryptionUser" value="client"/>
<entry key="passwordCallbackRef">
<ref bean="passwordCallback"/>
</entry>
</map>
</constructor-arg>
</bean>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:outInterceptors>
</jaxws:endpoint>
要加密响应,我需要知道客户端的公钥,我这样做是通过使用客户端证书别名设置encryptionUser
的值。但如果我这样做,我只能有一个客户。
如果我为每个客户端使用一个端点,我可以配置多个客户端。这是正确的方法吗?
我可以动态设置encryptionUser
的值吗?
答案 0 :(得分:0)
是。对于此场景,“encryptionUser”有一个特殊值 - &gt; “useReqSigCert”。它使用客户端签名证书来加密对客户端的响应。