私はSpringでApache CXFを学び始めました。まず、シンプルなクライアント/サーバーモデルを作成しました。see hereApache 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を使用していないように見えることです。私はデバッグモードでサーバーを実行しましたが、このクラスには行きません。誰でも、説明してください、どうすれば間違っていますか?
ありがとうございます。
PROGRESS:あなたは証明書は、サーバーのキーストアにないユーザーからの要求を提供しようとした場合
、エラーが「(発生したユーザWS-CLIENT1用ませ証明書が見つかりませんでした上記のjbossws-cxf.xmlファイルでもわかるように、キーストアパスワードコールバックハンドラも設定されていますが、プロパティファイルにはキーストアのパスワードがありますが、このコールバックハンドラ各キーのパスワードを設定するために使用されます(ストアで各キーがインポートされたときに使用されたものと一致します)。
ありがとうございます。私は署名メカニズムを使用したいだけです。出来ますか? – Dmitry
パスワードは、とにかくコールバックが使用されている必要があります。しかし、それはもちろんIMHOです) – Dmitry
元の質問は「PasswordCallbackHandler'が呼び出されなかった理由」でした。私の答えには何が入っていますか?あなたは適切な行動を逃しました。署名のみが必要な場合は、 'Signature'アクションだけを残して、両方の内容から' passwordCallbackRef'と 'user'エントリを安全に削除することができます。私はあなたが 'PasswordCallbackHandler'がCXFフレームワークによって呼び出され、ユーザーとパスワードが有効であればアプリケーションに尋ねることを理解して、それは署名とは関係ないことを願っています。これに対応して、キーストアのパスワードを 'client/server.properties'に定義する必要があります。 –