2012-01-27 27 views
6

私は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:あなたは証明書は、サーバーのキーストアにないユーザーからの要求を提供しようとした場合

  1. 、エラーが「(発生したユーザWS-CLIENT1用ませ証明書が見つかりませんでした上記のjbossws-cxf.xmlファイルでもわかるように、キーストアパスワードコールバックハンドラも設定されていますが、プロパティファイルにはキーストアのパスワードがありますが、このコールバックハンドラ各キーのパスワードを設定するために使用されます(ストアで各キーがインポートされたときに使用されたものと一致します)。

答えて

3

wss4jのソースコードのいくつかの調査の後で、Signatureアクション(唯一)の場合にWSS4JInInterceptorにコールバックハンドラがないことに気付きました。

0

私は、サーバーとクライアントの両方のコンテキスト(そうでないあなただけのアクションに署名している)に<entry key="action" value="UsernameToken Signature" />を追加する必要があるとします。クライアントのためにも<entry key="passwordType" value="PasswordText" />が必要かもしれません(私は何がデフォルトであるのかわかりません:平文またはダイジェスト、私は最後のものと思われます)。

+0

ありがとうございます。私は署名メカニズムを使用したいだけです。出来ますか? – Dmitry

+0

パスワードは、とにかくコールバックが使用されている必要があります。しかし、それはもちろんIMHOです) – Dmitry

+0

元の質問は「PasswordCallbackHandler'が呼び出されなかった理由」でした。私の答えには何が入っていますか?あなたは適切な行動を逃しました。署名のみが必要な場合は、 'Signature'アクションだけを残して、両方の内容から' passwordCallbackRef'と 'user'エントリを安全に削除することができます。私はあなたが 'PasswordCallbackHandler'がCXFフレームワークによって呼び出され、ユーザーとパスワードが有効であればアプリケーションに尋ねることを理解して、それは署名とは関係ないことを願っています。これに対応して、キーストアのパスワードを 'client/server.properties'に定義する必要があります。 –

関連する問題