Apache CXF + Spring: простая аутентификация сертификата - PullRequest
6 голосов
/ 27 января 2012

Я начал изучать Apache CXF с Spring.Прежде всего, я создал простую модель клиент / сервер: см. Здесь

Теперь я пытаюсь использовать простую аутентификацию сертификата.Чтобы я изменил файлы конфигурации (для сервера и клиента): 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. из ресурса : "Как видно из файла jbossws-cxf.xml выше, также настроен обработчик обратного вызова пароля хранилища ключей; в то время как в файле свойств есть пароль для хранилища ключей, используется этот обработчик обратного вызоваустановить пароль для каждого ключа (он должен совпадать с тем, который использовался, когда каждый ключ был импортирован в хранилище). "

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Что ж, после некоторого исследования исходного кода wss4j я понял, что в WSS4JInInterceptor нет обработчика обратного вызова в случае действия Signature (только).

0 голосов
/ 28 января 2012

Полагаю, вам нужно добавить <entry key="action" value="UsernameToken Signature" /> в контексты сервера и клиента (в противном случае у вас есть только действие подписи).Также для клиента может потребоваться <entry key="passwordType" value="PasswordText" /> (я не уверен, что по умолчанию: обычный текст или дайджест, я полагаю, последний).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...