2009年11月28日土曜日

Rampart 1.4/Tomcat v6.0/Eclipse 3.5

Tomcat 上の rampart 1.4 を Eclipse から動かしてみるテスト。 平文のユーザ名とパスワードを含む SOAP メッセージを、HTTPS で保護してみたい。Ant から動かすサンプルがあるけど、敢えてEclipse で動かす事にした。コード類はほぼそのまま。 ■使ったもの
  • Eclispe 3.5 Galileo
  • WTP 3.1.1
  • Axis2 1.4.1 (1.5.1 はダメだった…)
  • Rampart 1.4
  • Rampart policy サンプル下の sample-tomcat
  • もしかしたら、いるかもしれないもの
    • jaxen-1.1.1.jar
    • mex-1.5.1-impl.jar
■ 前提
  • Eclipse WTP で Tomcat v6.0 サーバが構成されている事(Servers ビューに表示されていること。)
  • rampart 1.4 がインストールされているフォルダを{rampart}とする。
  • {rampart}/sample/policy/sample-tomcatを{sample-tomcat}とする。
■ 作り方 ◆ サーバ の構成変更
  • [Project Explorer]/[Servers] 下の Tomcatサーバ構成 (普通は「Tomcat v6.0 Server at localhost-config」的な名前) に着目する。
  • ここに Rampart サンプル内の service.jks をコピーする。中身を見たかったら、コマンドプロンプトで パスの通っている所から keytool -list -v -keystore service.jks と打ち込めば、パスワードを聞いてくるので apache と応えれば、詳しい内容が表示される。
  • service.xml を開いて、以下のように port 8443 の定義を追加する。
    <Connector 
       SSLEnabled="true" 
       clientAuth="false" 
       keystoreFile="conf/service.jks" 
       keystorePass="apache" 
       maxThreads="150" 
       port="8443" 
       protocol="HTTP/1.1" 
       scheme="https" 
       secure="true" 
       sslProtocol="TLS" 
       truststoreFile="conf/service.jks" 
       truststorePass="apache" 
       truststoreType="JKS"/>
  • サーバを [Publish] する。
  • サーバを [Start] して、コンソールに「情報: Coyote HTTP/1.1を http-8443 で起動します」と表示され、他に以上が無いのを確認。
◆ サービスを作る
  • 新規 Dynamic Web Project ウィザードで以下のように指定
    • 適当なプロジェクト名をつける。rampart-trial2とした
    • Configuration -> Modify...->Axis Web Services にチェック
  • {sample-tomcat}のソース(*.javaファイル3つ)を, src 下に[Import]する。
  • WebContent/WEB-INF/lib 下に、{rampart}/lib 下の*.jarをコピーする。
  • WebContent/WEB-INF/modules 下に、{rampart}/modules/rampart-1.4.marをコピーする
  • SimpleService ウェブ・サービス作成
    • プロジェクトの コンテキストメニューから、[New]->[Other]->[Web Service]で、[Next>]押下
    • タイプにBottomUp、インプリメンテーションにSimpleService を設定して、スライダーを AssembleService にあわせる。
    • 「Configuration」の下を見て、Server→Tomcat v6.0、Web service runtime→Axis2、Service project→rampart-trial2になっている事を確認して、[Next>]押下.
    • [Finish]を押下して、WebContent/WEB-INF/services下に SimpleService フォルダが出来ていることを確認
  • SimpleService/META-INF/service.xmlの内容を、{sample-tomcat}/services.xmlの内容で置換。(新規 Web Service のウィザードの中で、既存 services.xml を指定するところがあるけど、上手く動かなかった。)
  • Tomcat サーバに追加して、[Restart]する.
  • ブラウザからhttps://127.0.0.1:8443/rampart-trial2/axis2-admin/を叩いて、admin/axis2 でログインする。
  • [Available Services]を見て、SimpleService が表示されているのを確認。EPR はこんな感じのはず。
    https://127.0.0.1:8443/rampart-trial2/services/SimpleService
  • ついでに WSDL も見て、<wsp:Policy>が入っている事と、他に以上が無いことを確認。
◆ クライアントを作る
  • Client クラスのコードは上でインポート下のをそのまま使う
  • プロジェクト直下に client_repository を以下のように構成する。
    client_repository/
       conf/
       module/
          addressing-1.5.1.mar
          rampart-1.4.mar
  • Client クラスのコンテキストメニューから、[Run As...]/[Run Configuration...] でフォームを開いて、"Java Application" から[New]
    • 「Name」には適当に実行の名前を指定。ここでは 「rampart client」とした。
    • Program Arguments に以下のように指定。
          https://127.0.0.1:8443/rampart-trial2/services/SimpleService
          client_repository
          client_repository/conf/policy.xml
  • もし無かったら、jaxen-1.1.1.jar と、mex-1.5.1-impl.jar を適当に探して、WEB-INF/lib 下に 置いておく。
■ 動かす
  • rampart clientを実行する。Eclipse の Console ビュー にて、以下のような内容のレスポンスが表示されることを確認(本当は一行)。
    <ns:echoResponse xmlns:ns="http://sample.tomcat.rampart.apache.org">
      <ns:return>Hello world</ns:return>
    </ns:echoResponse>
  • クラスパスの通っているところにlog4j.properties を置いておけば、クライアントのログ出力で、リクエストとレスポンスの中身がわかる。ユーザ名とパスワードを平文で送っている事がわかる。
    <?xml version='1.0' encoding='UTF-8'?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
          <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-16291471">
            <wsu:Created>2009-11-28T04:49:45.562Z</wsu:Created>
            <wsu:Expires>2009-11-28T04:54:45.562Z</wsu:Expires>
          </wsu:Timestamp>
          <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-27667505">
            <wsse:Username>alice</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobPW</wsse:Password>
          </wsse:UsernameToken>
        </wsse:Security>
        <wsa:To>https://127.0.0.1:8443/rampart-trial2/services/SimpleService</wsa:To>
         <wsa:MessageID>urn:uuid:488460AB6C6837F5671259383785225</wsa:MessageID>
        <wsa:Action>urn:echo</wsa:Action>
      </soapenv:Header>
      <soapenv:Body>
        <ns1:echo xmlns:ns1="http://sample.tomcat.rampart.apache.org">
          <param0>Hello world</param0>
        </ns1:echo>
      </soapenv:Body>
    </soapenv:Envelope>
  • localhost をキャプチャできるネットワークモニタで見てみると、ちゃんと暗号化して通信している事も確認できる。
一応、Eclipse + Axis + Rampart を連携させられた。ただ、Axis2 1.5.1 では README 通りの作法でも動かなかったのと、WTP との相性が悪いのもあって、1.4.1 でしか動かせてないのが悩ましい。まあ、実プロジェクトに導入するときのたたき台くらいにはなるかも。

0 件のコメント:

コメントを投稿