2009年11月20日金曜日

Rampart 1.4/暗号化/サービス側

前ポストの StockQuoteサービスとクライアントのペアを修正して、暗号化された SOAP メッセージ をやり取りするようにしてみる。まずはサービスから。 ■ サービスを暗号前提にする
  • コールバッククラスを書く。現実のコールバックは LDAP とかを見に行ったりして本物のパスワードを設定するけど、関係ないのでここは手を抜く。
    package samples.quickstart.callback;
    import 略
    
    public class PWCBHandler implements CallbackHandler {
       public void handle(Callback[] callbacks) 
             throws IOException, UnsupportedCallbackException {
          for (Callback callback: callbacks) {
             WSPasswordCallback pwcb = (WSPasswordCallback)callback;
             System.out.println("ID=" + pwcb.getIdentifer());
             pwcb.setPassword("rampart");
          }
       }
    }
  • resources/META-INF/services.xml に暗号機能を追記する。
    <service name="StockQuoteService" scope="application" targetNamespace="http://quickstart.samples/">
        <descript…
          …略
        …name="ServiceClass">samples.quickstart.service.pojo.StockQuoteService</parameter>
        <module ref="rampart" />
        <parameter name="InflowSecurity">
          <action>
            <items>Encrypt</items>
            <passwordCallbackClass>samples.quickstart.callback.PWCBHandler</passwordCallbackClass>
            <decryptionPropFile>service.properties</decryptionPropFile>
          </action>
        </parameter>
    </service>
  • 上のコードの<decryptionPropFile>から参照されているファイル service.properties を、resources/ 下に作り、arrファイル 直下に含まれるようにbuild.xml を編集。
    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.alias=service
    org.apache.ws.security.crypto.merlin.keystore.password=rampart
    org.apache.ws.security.crypto.merlin.file=ourkeys.jks
  • 上記 service.properties の中から参照されているキーストア ourkeys.jksを、keytool を使って resources 下に作る。キーストア・パスワードを聞いてくるので、service.properties にあわせて rampart と入力。出来てきた ourkeys.jks も arr ファイル直下に含まれるようにbuild.xml を編集
    keytool -keyalg "RSA" -sigalg "MD5withRSA" -genkeypair ourkeys.jks -alias client
    いろいろ聞かれるので適当に答える
    keytool -keyalg "RSA" -sigalg "MD5withRSA" -genkeypair ourkeys.jks -alias service
    いろいろ聞かれるので適当に答える
  • generate.service で arr ファイルに丸める。中身はこんな感じ
    ourkeys.jks
    service.properties
    META-INF/
       MANIFEST.MF
       services.xml
    samples/
       quickstart/
          callback/
             PWCBHandler.class
          service/
             pojo/
                StockQuoteService.class
  • 再デプロイする。手でコピーしても良いけど、一発で成功しなかったら後で繰り返すとき面倒なので ant タスクを書いておくと便利。
    <target name="deploy.service" depends="generate.service">
        <copy file="${build.dir}/StockQuoteService.aar" 
           toDir="${TOMCAT_HOME}/webapps/axis2/WEB-INF/services"/>
    </target>
soapUI なんかを使って、暗号化なしの素の getPrice メッセージを送ってみると、サーバ側で以下のような例外がトレースされる。
org.apache.axis2.AxisFault: WSDoAllReceiver: 
Incoming message does not contain required Security header
「セキュリティヘッダが見当たらない」と言ってきたので、ひとまず上手くいった模様。 次は、クライアントがリクエストを暗号化して送るようにする。→[次ポスト]

0 件のコメント:

コメントを投稿