2.18 Axis WS-SecurityとWS-Addressing
「SOAPエージェントメッセージ・ハンドラー」を参照してください。
Axisでは、Apache WSS4J、XML-Security、WS-Addressingの各プロジェクトを使用することでWS-Security機能が提供されます。
WS-SecurityとWS-Addressingの機能を使用可能にするには、これらの機能を有効にする必要がある特定のサービスに対してAxisクライアント構成ファイルを構成します。
グローバルな構成パラメータenableNamespacePrefixOptimizationをfalseにする必要があるため、プロセスの署名後にXMLは変更されません。
クライアント構成例
<?xml version="1.0" encoding="utf-8"?>
<deployment name="defaultClientConfig" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="addressing.sendReplyTo" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
</globalConfiguration>
<service name="MyServicePort">
<requestFlow>
<handler type="java:com.acme.MyHandler">
<parameter name="acme.keyword" value="value"/>
</handler>
</requestFlow>
</service>
<service name="XYZPort">
<requestFlow>
<handler type="java:org.apache.axis.message.addressing.handler.AddressingHandler">
<!--参照要素は同じ順序で追加される-->
<parameter name="referencePropertyNames"
value="{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}Action;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}MessageID;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}ReplyTo;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}To;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}From"/>
</handler>
<handler type="java:org.apache.ws.axis.security.WSDoAllSender">
<!--アクションの順序が重要。タイムスタンプ署名を行う場合は、Timestampの次にSignatureを指定する-->
<parameter name="action" value="Timestamp Signature"/>
<parameter name="user" value="XYZLabel"/>
<parameter name="passwordCallbackClass" value="com.acme.security.PasswordCallback"/>
<parameter name="signatureKeyIdentifier" value="DirectReference"/>
<parameter name="signaturePropFile" value="pki/security.properties"/>
<parameter name="timeToLive" value="300"/>
<parameter name="precisionInMilliseconds" value="false" />
<!--参照要素は同じ順序で追加される-->
<parameter name="signatureParts"
value="{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}Action;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}MessageID;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}ReplyTo;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}To;
{Element}{http://schemas.xmlsoap.org/ws/2004/03/addressing}From;
{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;
{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body"/>
</handler>
</requestFlow>
</service>
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender"/>
<transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender"/>
</deployment>
最新のWS-Addressingネームスペースは、現在のhttp://schemas.xmlsoap.org/ws/2004/08/addressingですが、.Netなどの一部のWebサービス・サーバーではネームスペースhttp://schemas.xmlsoap.org/ws/2004/03/addressingが必要になります。
2004/08のネームスペースを2004/03のネームスペースに変更するには、SOAPエージェントウィザードで使用されるAGENT_INCLUDE.TXTファイルに以下のコードを含める必要があります。
stub._setProperty ( org.apache.axis.message.addressing.Constants.ENV_ADDRESSING_NAMESPACE_URI,
org.apache.axis.message.addressing.Constants.NS_URI_ADDRESSING_2004_03 ) ;
パラメータ・ユーザーには、アクションのタイプに応じていくつかの役割を持たせることができます。アクションのいずれかが署名の場合、ユーザー値は指定したキー・ストア・ファイルのキー・ストアの別名/ラベルになります。秘密鍵のパスワードは、passwordCallbackパラメータで指定されたカスタム・コールバック・クラスで提供されます。ユーザー値は、コールバック・クラスのインスタンスにIDとして渡されます。
パラメータsignaturePropFileは、署名プロセスで使用されるプロパティ・ファイルを指定します。このファイルは、使用されるキー・ストア・ファイルとキー・ストアのパスワードを指定します。
#
# Webservice Security
#
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=pkcs12
org.apache.ws.security.crypto.merlin.file=pki/keystore.pfx
org.apache.ws.security.crypto.merlin.keystore.password=keypassword
#
以下の例は、パスワード・コールバック・クラスのテンプレートです。
package com.acme.security ;
import java.io.* ;
import javax.security.auth.callback.Callback ;
import javax.security.auth.callback.CallbackHandler ;
import javax.security.auth.callback.UnsupportedCallbackException ;
import org.apache.ws.security.WSPasswordCallback ;
public class PasswordCallback implements CallbackHandler
{
public PasswordCallback ()
{
}
public void handle ( Callback[] callbackArray ) throws IOException, UnsupportedCallbackException
{
System.out.println ( "PasswordCallback handle" ) ;
for ( int i = 0; i < callbackArray.length; i++ )
{
if ( callbackArray[i] instanceof WSPasswordCallback )
{
WSPasswordCallback callback = (WSPasswordCallback)callbackArray[i] ;
int usage = callback.getUsage () ;
String identifier = callback.getIdentifier () ;
if ( usage == WSPasswordCallback.UNKNOWN )
{
System.out.println ( "UNKNOWN " + identifier ) ;
continue ;
}
if ( usage == WSPasswordCallback.DECRYPT )
{
System.out.println ( "DECRYPT " + identifier ) ;
continue ;
}
if ( usage == WSPasswordCallback.SIGNATURE )
{
System.out.println ( "SIGNATURE " + identifier ) ;
if ( identifier.equals ( "XYZLabel" ) )
{
/*
キー・ストア秘密鍵パスワード
*/
callback.setPassword ( "keypassword" ) ;
return ;
}
return ;
}
if ( usage == WSPasswordCallback.KEY_NAME )
{
System.out.println ( "KEY_NAME " + identifier ) ;
continue ;
}
if ( usage == WSPasswordCallback.USERNAME_TOKEN )
{
System.out.println ( "USERNAME_TOKEN " + identifier ) ;
if ( identifier.equals ( "myuser" ) )
{
callback.setPassword ( "mypassword" ) ;
return ;
}
return ;
}
if ( usage == WSPasswordCallback.USERNAME_TOKEN_UNKNOWN )
{
System.out.println ( "USERNAME_TOKEN_UNKNOWN " + identifier ) ;
continue ;
}
if ( usage == WSPasswordCallback.SECURITY_CONTEXT_TOKEN )
{
System.out.println ( "SECURITY_CONTEXT_TOKEN " + identifier ) ;
continue ;
}
}
}
throw new java.io.IOException ( "PasswordCallback: unrecognized password callback instance or callback usage" ) ;
}
}