前ポストの 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 件のコメント:
コメントを投稿