【问题标题】:Apache CXF + Spring: Simple Certificate AuthenticationApache CXF + Spring:简单的证书认证
【发布时间】:2012-01-27 15:15:47
【问题描述】:

我已经开始使用 Spring 学习 Apache CXF。首先,我创建了一个简单的客户端/服务器模型:see here

现在我正在尝试使用简单的证书身份验证。这样我就更改了配置文件(用于服务器和客户端): cxf-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<jaxws:endpoint
    id="helloWorld"
    implementor="service.HelloWorldImpl"
    address="/HelloWorld">

    <jaxws:features>
        <bean class="org.apache.cxf.feature.LoggingFeature"/>
    </jaxws:features>
    <jaxws:inInterceptors>
       <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor"/>
       <ref bean="WSS4JInInterceptor"/>
    </jaxws:inInterceptors>
</jaxws:endpoint>

<bean id="WSS4JInInterceptor"  class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
    <constructor-arg>
        <map>
            <entry key="action" value="Signature"/>
            <entry key="passwordCallbackRef">
                <ref bean="passwordCallback"/>
            </entry>
            <entry key="signaturePropFile" value="server_sign.properties"/>
        </map>
    </constructor-arg>
</bean>
<bean id="passwordCallback" class="service.PasswordCallbackHandler" />

server_sign.properties

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=keyStorePassword
org.apache.ws.security.crypto.merlin.file=publicstore.jks

cxf-client-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://cxf.apache.org/jaxws
    http://cxf.apache.org/schema/jaxws.xsd">

<bean id="client" class="service.HelloWorld" factory-bean="clientFactory" factory-method="create"/>

<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass" value="service.HelloWorld"/>
    <property name="address" value="http://localhost:8080/services/HelloWorld"/>
    <property name="outInterceptors">
        <list>
            <bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor"/>
            <ref bean="WSS4JOutInterceptor"/>
        </list>
    </property>
</bean>

<bean id="WSS4JOutInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
    <property name="properties">
        <map>
            <entry key="action" value="Signature"/>
            <entry key="user" value="ws-client" />
             <entry key="passwordCallbackRef">
                <ref bean="passwordCallback"/>
            </entry>
            <entry key="signaturePropFile" value="client_sign.properties"/>
        </map>
    </property>
</bean>

<bean id="passwordCallback" class="client.PasswordCallbackHandler" />

客户端运行良好。它使用它的 PasswordCallbackHandler。问题是服务器似乎没有使用它的 PasswordCallbackHandler。我已经在调试模式下运行了服务器,但它没有进入这个类。谁能解释一下,我做错了什么?

提前致谢。

进展:

  1. 如果您尝试提供来自用户的请求,而该证书不在服务器的密钥库中,则会引发错误(“未找到用于签名的用户 ws-client1 的证书”)

  2. 来自the resource:“正如您在上面的 jbossws-cxf.xml 文件中看到的,还配置了密钥库密码回调处理程序;虽然属性文件有密钥库的密码,但此回调处理程序是用于为每个密钥设置密码(它必须与每个密钥在商店中导入时使用的密码相匹配)。”

【问题讨论】:

    标签: java web-services spring cxf


    【解决方案1】:

    好吧,经过对 wss4j 源代码的一些研究,我意识到,在 Signature 动作的情况下,WSS4JInInterceptor 中没有回调处理程序(仅)。

    【讨论】:

      【解决方案2】:

      我想您需要将&lt;entry key="action" value="UsernameToken Signature" /&gt; 添加到服务器和客户端上下文中(否则您只有签名操作)。同样对于客户端&lt;entry key="passwordType" value="PasswordText" /&gt; 可能是必要的(我不确定默认是什么:纯文本或摘要,我想是最后一个)。

      【讨论】:

      • 谢谢你的回答。但我只想使用签名机制。有可能吗?
      • 对于密码,似乎无论如何都必须使用回调。但这当然是恕我直言)
      • 您最初的问题是“为什么不调用 PasswordCallbackHandler”。我的回答是什么:您错过了适当的行动。如果您只需要签名,那么您只需留下Signature 操作,并且可以安全地从两个内容中删除passwordCallbackRefuser 条目。我希望您了解PasswordCallbackHandler 是由CXF 框架调用来询问应用程序,用户和密码是否有效,这与签名无关。您的密钥库的密码应在client/server.properties 中相应定义。
      • 无法删除“用户”属性,因为会引发“指定操作的空用户名”错误 (action=Signature)。
      • 服务器不需要密码:公钥存储在公共存储中,会自动选择密钥。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多