0

cxfでSOAPメッセージを送信するたびにws-security情報を動的に変更/設定できるようにしたいと思います。これをどのように行うのが最善でしょうか。

詳細:実行時にキーストア名、キーストアエイリアス、パスワード、ホスト名などの設定を変更したいのですが、メッセージの送信ごとに変更することをお勧めします。現在使用しているのは、署名用のWSS4JOutInterceptorおよびWSS4JInInterceptorインターセプターを備えたjaxwsクライアントです。そして私はSSL/TLS通信のためにtlsクライアントパラメータでhttpコンジットを使用しています。jaxwsクライアントとhttpコンジットはどちらもSpringで構成され、キーストア名、エイリアス、パスワードなどの構成がSpring構成で設定されます。

オプションが表示されます:1)グローバルプロパティを介して実行時にこれらの設定を変更します。2)メッセージの送信ごとにこれらの設定を変更します(推奨)。

2)望ましいですが、最も難しいと思います。これはどのようにすればよいですか?

私は次のことを考えていました。a)jaxwsクライアント:メッセージをインターセプトする独自のインインターセプターとアウトインターセプターを作成し、そのメッセージに必要なセキュリティ設定に応じて、正しい(キャッシュされた)WSS4JOutInterceptorインターセプターを使用します。WSS4JOutInterceptorインターセプターがキャッシュに存在しない場合は、作成されます(おそらく、最大5つのWSS4JOutInterceptorインスタンスがキャッシュされています)。ただし、@ Webserviceプロキシと通信してsoapリクエスト/メッセージを作成および送信するときに、アプリの他の部分で認識されているインターセプターで必要な設定をどのように判断できますか...追加できる可能性がありますJaxWsClientProxyを介したsoapメッセージに対するある種のsecurityInfoオブジェクトですが、どのように?...または、このセキュリティ情報がまだわかっているときに、soapメッセージを送信/作成するときにインターセプターを設定できます。

b)httpコンジット:ConduitSelectorを使用します(使用したことはありませんが、検出されます)。正しいhttpコンジットを選択できますが、(a)と同じ問題があります。石鹸メッセージを作成/送信するときに知られているように「使用」し、インターセプターは後で設定されます...おそらくメッセージの送信ごとにコンジットセレクターを設定する必要があります。

最後に、上記は大きな話になります;)しかし、私はあなたがいくつかのアドバイスを与えることができることは明らかだと思いますか?

4

2 に答える 2

0

パッケージは、org.apache.cxfカスタム クラスを作成する手間を省くのに非常に役立ち、基本的なインターフェイスに固執することができました。

インスタンスの場合、アプローチは次のようになります。

  • JAX-WSまたはwsimportクライアントを使用する
  • cxf WSS4JOutInterceptorを動的プロパティとともに使用する
  • CallbackHandlerキーストアへのアクセスに動的クラスを使用する

典型的な ( wsimport'd) クライアント パブリック API は次のようになります。

public class SomeServiceClient
{

  public SomeService getSomeService( URL url )
  {

    SomeService_Service svc = new SomeService_Service();

    SomeService someService = svc.getSomeServicePort();

    Client client = ClientProxy.getClient( someService );
    Endpoint cxfEP = client.getEndpoint();

    Map<String, Object> outProps = new HashMap<String, Object>();
    outProps.put( WSHandlerConstants.ACTION, "Signature" );
    outProps.put( WSHandlerConstants.USER, "foo" );
    outProps.put( WSHandlerConstants.PW_CALLBACK_CLASS, SomeClientCallbackHandler.class.getName() );
    outProps.put( WSHandlerConstants.SIG_PROP_FILE, "client-sign.properties" );

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor( outProps );

    cxfEP.getOutInterceptors().add( wssOut );

    return someService;
  }
}

WSHandlerConstants.USER渡す値、PW_CALLBACK_CLASS使用する値、および使用する値を決定するロジックを提供できSIG_PROP_FILEます。

プロパティ ファイルは次のようになります。複数のファイルから選択することも、これらのプロパティをクラスに動的に追加することもできます。

# properties for accessing the java keystore using Merlin
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=bar
org.apache.ws.security.crypto.merlin.keystore.alias=foo
org.apache.ws.security.crypto.merlin.keystore.file=foobar.keystore

最後にCallbackHandler、キーストアで特定した証明書のエイリアスのパスワードを提供する必要があります。これには、いくつかの動的ロジックも含まれる場合があります。

public class SomeClientCallbackHandler implements CallbackHandler
{

    @Override
    public void handle( Callback[] callbacks ) throws IOException, UnsupportedCallbackException
    {
        for( Callback thisCallback : callbacks )
        {
            WSPasswordCallback pwcb = (WSPasswordCallback)thisCallback;
            String user = pwcb.getIdentifier();
            int usage = pwcb.getUsage();

            if( usage == WSPasswordCallback.SIGNATURE )
            {
                if( "foo".equals( user ) ) pwcb.setPassword( "bar" );
            }
        }        
    }
}

最終的に、複数のキーストアを処理するためにこれをすべて「動的」にする作業と、一度だけ行う作業に比べて、それほど多くの作業はありません。独自の「in」または「out」インターセプターをコーディングするよりも好ましい場合があります。

于 2013-04-11T16:47:42.240 に答える