1.2.13. WS-Security

1.2.13.1. 事前準備

ここではWS-Securityの機能を使用するための準備について記載します。
Java Cryptography Extension (JCE) UnlimitedStrength Jurisdiction Policy Files の適用
鍵長192ビット、256ビットの暗号鍵を利用する(sp:AlgorithmSuiteにsp:Basic192やsp:Basic256などを適用する)場合、Java Cryptography Extension (JCE) UnlimitedStrength Jurisdiction Policy Filesをお使いのJava SEに対してインストールする必要があります。
Oracleのホームページからお使いのJavaのバージョンに合わせてファイルを取得し、<JAVA_HOME>/jre/lib/securityに置かれているlocal_policy.jar、US_export_policy.jarの2ファイルを上書き置換してください。
Bouncy Castle JCE セキュリティプロバイダの適用
暗号化方式にTriple DESを使用する(sp:AlgorithmSuiteにsp:TripleDESなどを適用する)場合、Bouncy Castle JCE セキュリティプロバイダを適用する必要があります。 Bouncy CastleJCE セキュリティプロバイダのJARファイルを<WebOTX_DIR>/domains/<ドメイン名>/lib/ext 配下にコピーします。このJARファイルは<WebOTX_DIR>/lib/wss/bcp/bcprov-jdk15on-150.jarにあります。

<JAVA_HOME>/jre/lib/securityにあるjava.securityにBouncy Castle JCE セキュリティプロバイダを次のように登録してください。
#
# List of providers and their preferenceorders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
これらの作業をすべて終了したら、ドメインを(再)起動してください。
キーストア、トラストストアの用意
メッセージの暗号化や署名、X509Tokenを利用した認証を行う場合、暗号鍵や証明書をあらかじめキーストア、トラストストアに登録しなければなりません。
Java SEのkeytoolを使用して、必要な暗号鍵、証明書を作成・登録してください。

鍵の作成、証明書のエクスポート/インポートのコマンド実行例を以下に記載します。
CallbackHandler、Validatorの作成
UsernameTokenやX509Tokenなどのセキュリティトークンを利用した認証を行う場合、CallbackHandlerやValidatorを事前に作成します。
CallbackHandlerやValidatorのクラスファイルは、WEB-INF/classesなど、CLASSPATHのルートに配置してください。
CallbackHandlerの作成方法は1.2.13.4. CallbackHandlerの実装を、Validatorの作成方法は1.2.13.5. Validatorの実装を参照してください。
SECUREMASTER連携の準備
SecuremasterTokenを利用した認証を行う場合、SECUREMASTER製品との連携のための準備が必要になります。
以下に設定の手順を示します。

SECUREMASTER製品の手順に従い、環境を構築します。
環境構築後、SECUREMASTER/AccessControlPlugInから、認証・認可に必要なjarファイルとsm_api_conf.xml.sampleを取得し、SECUREMASTER/EnterpriseAccessManagerでアクセス制御ポリシーファイルを生成します。
必要なjarファイルは下記のとおりです。 (**にはバージョン番号が入ります。実際のバージョンはSECUREMASTERのマニュアルでご確認ください。)

jarファイルと設定ファイルを認証・認可を利用するドメインの下記のフォルダに配置します。
設定ファイルは、sm_api_conf.xml.sampleを修正して適切な設定を施したものです。設定ファイルの記述方法については、SECUREMASTERのマニュアルを参照してください。 上記設定ファイルのパス設定については、1.2.13.2. サーバアプリケーションの定義1.2.13.3. クライアントアプリケーションの定義を参照してください。

<WebOTX_DIR>/lib/wss/wss-plugin.jarを、同様に上記のjarファイル配置場所に配置します。

また、SECUREMASTER連携で使用するパスワードを暗号化し、クライアント側設定ファイルに記載する必要があります。ここでは、パスワードの暗号化方法について説明します。設定ファイルへの設定方法については、1.2.13.3. クライアントアプリケーションの定義を参照してください。
パスワードの暗号化には、encryptwsspasswordを利用します。encryptwsspasswordは下記のバッチファイルもしくはシェルファイルとして提供しています。encryptwsspassword実行時に、暗号化に用いる鍵の情報と暗号化するパスワードを指定します。暗号鍵として使用できるのはRSA暗号方式の鍵のみです。 以下、encryptwsspasswordの使用方法を記載します。
構文
encryptwsspassword library_path -keystore keystore_path [-storetype keystore_type] [-storepassword keystore_password] [-alias key_alias] -password password
オプション
表1.2.13.1-1 オプション
オプション 説明
library_path wows-rt.jarのパスを指定します。wows-rt.jarは<WebOTX_DIR>/modules/wows-rt.jarにあります。
-keystore キーストアのパスを設定します。
-storetype キーストアのタイプを設定します。省略した場合はJKSとなります。
-storepassword キーストアのパスワードを設定します。省略した場合はchangeitとなります。
-alias 鍵のエイリアスを設定します。省略した場合はwebotxとなります。
-password 暗号化するパスワードを設定します。
encryptwsspasswordを実行すると、下記のように暗号化された文字列が取得できます。 この例では、「user_pass」というパスワードを暗号化しています。
>encryptwsspassword C:\WebOTX\modules\wows-rt.jar -keystore C:\WebOTX\domains\domain1\config\keystore.jks -password user_pass
1 10, 2014 1:14:33 午後 com.nec.webotx.webservice.xml.wss.util.PasswordEncrypter main
情報: 5BF46CD442D40C4BC23D296196B207EE79D60E601DAC9219A76D32B2D19AA4387F2F22F28F7160E67F73B6350683ABE8758E7927FE8F6027AD35AFBB6BE5E0E8FBC305590C577ECF990DA5E5E2F6DD347E9BE21950DC117BEFADC7C431C858AA59EBEE9C26FDE7CF0E44AFCF964E76A830BC976F4B4C7B37E355F210CA7E03A3
1 10, 2014 1:14:34 午後 com.nec.webotx.webservice.xml.wss.util.PasswordEncrypter main
情報: Process succeeded.
「5BF46CD442....10CA7E03A3」の文字列がパスワードを暗号化した文字列となっているので、この文字列をクライアント側設定ファイルのwo92spc:CallbackHandler要素のpassword属性に設定します。wo92spc:SmKeyStoreに設定する鍵情報は、ここで使用した鍵情報と同じものにしなければなりません。

Memo
<JAVA_HOME>はJava SEのインストールルートディレクトリを指します。
<WebOTX_DIR>はWebOTXのインストールルートディレクトリを指します。
<DOMAIN_ROOT>はドメインのルートディレクトリを指します。

 

1.2.13.2. サーバアプリケーションの定義

ここではサーバ側のWS-Security設定の定義方法について説明します。
WS-Securityの設定を定義する方法はアプリケーションにnec-jaxws.xmlを含めているかどうかにより変わります。
どちらの方法でも、WS-SecurityPolicyの仕様に従ってWS-Securityの動作を定義できます。 WS-SecurityPolicyのサポート範囲に関しては、WS-SecurityPolicyのサポート範囲を参照してください。
以下、WSDLファイルにWS-Securityの設定を記述する方法について説明します。
なお、構文中の記号について、以下のように定義します。

Memo
nec-jaxws.xmlが存在しない場合、Webサービスのアノテーション定義をもとにWSDLが生成されるため、WSDLから独立した設定ファイルを作成する必要があります。設定ファイルの内容はWebサービスのWSDL定義にポリシー・アサーションを追加したものになります。
設定ファイルの名称は以下のようにします。
  wsit-<Webサービス実装クラス名>.xml
たとえばcom.nec.AddNumbersPortTypeImpl.classがWebサービス実装クラスであった場合、設定ファイル名は「wsit-com.nec.AddNumbersPortTypeImpl.xml」となります。 この設定ファイルはWEB-INF/classesなど、CLASSPATHのルートに配置してください。

名前空間の定義
本節で使用するXML名前空間について説明します。
標準仕様のアサーションの説明で利用する名前空間は下記のとおりです。
表1.2.13.2-1 標準仕様の名前空間
Prefix Namespace
sp http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702
wsam http://www.w3.org/2007/05/addressing/metadata
wsp http://www.w3.org/ns/ws-policy
wsu http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd
wsdl http://schemas.xmlsoap.org/wsdl/
WebOTX独自のアサーションで利用する名前空間は下記のとおりです。
表1.2.13.2-2 WebOTX独自の名前空間
Prefix Namespace
wo92sp http://nec.com/ws-sx/wssp/201312
wo92sps http://nec.com/ws-sx/wssp/server/201312
wowsp http://nec.com/xml/ns/wsit/policy
ポリシー・アサーションの設定手順
WS-Securityの定義方法を説明します。

    (1) WSDLファイルを作成します。
    (2) wsdl:definitions要素の子要素としてWS-Securityのポリシー定義を追加します。
    (3) wsdl:binding、wsdl:operation/inputまたはwsdl:operation/output要素の子要素としてwsp:PolicyReference要素を追加して、ポリシーを参照します。

(3)のwsp:PolicyReference要素の追加箇所によって、以下のようにWS-Securityの適用範囲が異なります。

以下、バインディング定義とオペレーション定義の記述方法について説明します。 使用できるアサーションはWS-SecurityPolicy1.2に従います。
WebOTX独自のアサーション
設定できるアサーションは、WS-SecurityPolicyで定義されているアサーションとWebOTX独自のアサーションがあります。
ここではWebOTX独自のアサーションについて説明します。
WS-Securityのサポート範囲
WS-Security 1.1のサポート範囲について以下の表に記します。
表1.2.13.2-11
大分類 小分類 サポート
Security Tokens User Name Token
Binary Security Tokens
XML Tokens ×
EncryptedData Token
Token References Direct References
Key Identifiers
Embedded References ×
ds:KeyInfo
Key Names ×
Encrypted Key reference
Signatures Algorithms
Signing Messages
Signing Tokens
Signature Validation
Signature Confirmation
Encryption xenc:ReferenceList
xenc:EncryptedKey
Encrypted Header
Processing Rules
Security Timestamps
Error Handling
WS-SecurityPolicyのサポート範囲
WS-SecurityPolicy 1.2のサポート範囲について以下の表に記します。
表1.2.13.2-12
大分類 中分類 小分類 アサーション サポート
Protection Assertions Integrity Assertions SignedParts Assertion
SignedElements Assertion ×
Confidentiality Assertions EncryptedParts Assertion
EncryptedElements Assertion ×
ContentEncryptedElements Assertion ×
Required Elements Assertion RequiredElements Assertion ×
RequiredParts Assertion ×
Token Assertions Token Inclusion
Token Issuer and Required Claims ×
Token Properties [Derived Keys] Property
[Explicit Derived Keys] Property ×
[Implied Derived Keys] Property ×
Token Assertion Types UsernameToken Assertion @sp:IncludeToken ○ ※1
sp:Issuer ×
sp:IssuerName ×
wst:Claims ×
sp:NoPassword
sp:HashPassword
sp:RequireDerivedKeys
sp:RequireExplicitDerivedKeys ×
sp:RequireImpliedDerivedKeys ×
sp:WssUsernameToken10
sp:WssUsernameToken11
IssuedToken Assertion ×
X509Token Assertion @sp:IncludeToken ○ ※2
sp:Issuer ×
sp:IssuerName ×
wst:Claims ×
sp:RequireDerivedKeys
sp:RequireExplicitDerivedKeys ×
sp:RequireImpliedDerivedKeys ×
sp:RequireKeyIdentifierReference
sp:RequireIssuerSerialReference
sp:RequireEmbeddedTokenReference ×
sp:RequireThumbprintReference
sp:WssX509V3Token10
sp:WssX509Pkcs7Token10 ×
sp:WssX509PkiPathV1Token10 ×
sp:WssX509V1Token11 ×
sp:WssX509V3Token11 ×
sp:WssX509PkcsToken11 ×
sp:WssX509PkiPathV1Token11 ×
KerberosToken Assertion ×
SpnegoContextToken Assertion ×
SecurityContextToken Assertion ×
SecureConversationToken Assertion @sp:IncludeToken ○ ※2
sp:Issuer ×
sp:IssuerName ×
wst:Claims ×
sp:RequireDerivedKeys
sp:RequireExplicitDerivedKeys ×
sp:RequireImpliedDerivedKeys ×
sp:RequireExternalUriReference ×
sp:SC13SecurityContextToken ×
sp:MustNotSendAmend ×
sp:MustNotSendRenew ×
sp:BootstrapPolicy
SamlToken Assertion ×
RelToken Assertion ×
HttpsToken Assertion @sp:IncludeToken ×
sp:Issuer ×
sp:IssuerName ×
sp:Claims ×
sp:HttpBasicAuthentication ×
sp:HttpDigestAuthentication ×
sp:RequireClientCertificate
KeyValueToken Assertion ×
Security Binding Assertions Algorithm Suite Assertion sp:Basic256
sp:Basic192
sp:Basic128
sp:TripleDes
sp:Basic256Rsa15
sp:Basic192Rsa15
sp:Basic128Rsa15
sp:TripleDesRsa15
sp:Basic256Sha256
sp:Basic192Sha256
sp:Basic128Sha256
sp:TripleDesSha256
sp:Basic256Sha256Rsa15
sp:Basic192Sha256Rsa15
sp:Basic128Sha256Rsa15
sp:TripleDesSha256Rsa15
sp:InclusiveC14N ×
sp:SoapNormalization10 ×
sp:STRTransform10 ×
sp:XPath10 ×
sp:XPathFilter20 ×
sp:AbsXPath ×
Layout Assertion sp:Strict
sp:Lax
sp:LaxTsFirst
sp:LaxTsLast
TransportBinding Assertion sp:TransportToken
sp:AlgorithmSuite
sp:Layout
sp:IncludeTimestamp
SymmetricBinding Assertion sp:EncryptionToken
sp:SignatureToken
sp:ProtectionToken
sp:AlgorithmSuite
sp:Layout
sp:IncludeTimestamp
sp:EncryptBeforeSigning
sp:EncryptSignature
sp:ProtectTokens
sp:OnlySignEntireHeadersAndBody
AsymmetricBinding Assertion sp:InitiatorToken
sp:RecipientToken
sp:AlgorithmSuite
sp:Layout
sp:IncludeTimestamp
sp:EncryptBeforeSigning
sp:EncryptSignature
sp:ProtectTokens
sp:OnlySignEntireHeadersAndBody
Supporting Tokens SupportingTokens Assertion ○ ※3
SignedSupportingTokens Assertion ○ ※3
EndorsingSupportingTokens Assertion ○ ※3
SignedEndorsingSupportingTokens Assertion ○ ※3
SignedEncryptedSupportingTokens Assertion ○ ※3
EncryptedSupportingTokens Assertion ○ ※3
EndorsingEncryptedSupportingTokens Assertion ○ ※3
SignedEndorsingEncryptedSupportingTokens Assertion ○ ※3
WSS: SAP Message Security Options Wss10 Assertion sp:MustSupportRefKeyIdentifier
sp:MustSupportRefIssuerSerial
sp:MustSupportRefExternalURI ×
sp:MustSupportRefEmbeddedToken ×
Wss11 Assertion sp:MustSupportRefKeyIdentifier
sp:MustSupportRefIssuerSerial
sp:MustSupportRefExternalURI ×
sp:MustSupportRefEmbeddedToken ×
sp:MustSupportRefThumbprint
sp:MustSupportRefEncryptedKey ×
sp:RequireSignatureConfirmation
WS-Trust Options Trust13 Assertion ×

1.2.13.3. クライアントアプリケーションの定義

ここではクライアント側のWS-Security設定の定義方法について説明します。
クライアント側は、1.2.13.2. サーバアプリケーションの定義の手順で作成されたWSDLを参照することで動作します。 追加でクライアント側に必要なキーストアやトラストストア等の設定を行うために、設定ファイルを作成します。

以下、設定ファイルにWS-Securityの設定を記述する方法について説明します。
なお、構文中の記号について、以下のように定義します。
設定ファイルの命名則と配置場所
クライアント独自の設定を有効にするために、設定ファイルを作成します。設定ファイルの内容はWebサービスのWSDLファイルにポリシー・アサーションを追加したものになります。

設定ファイルの名称は以下のようにします。
  wsit-client.xml

この設定ファイルはCLASSPATHのルートに配置してください。
名前空間の定義
本節で使用するXML名前空間について説明します。
標準仕様のアサーションの説明で利用する名前空間は下記のとおりです。
表1.2.13.3-1 標準仕様の名前空間
Prefix Namespace
sp http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702
wsp http://www.w3.org/ns/ws-policy
wsu http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd
wsdl http://schemas.xmlsoap.org/wsdl/
WebOTX独自のアサーションで利用する名前空間は下記のとおりです。
表1.2.13.3-2 WebOTX独自の名前空間
Prefix Namespace
wo92sp http://nec.com/ws-sx/wssp/201312
wo92spc http://nec.com/ws-sx/wssp/client/201312
wowsp http://nec.com/xml/ns/wsit/policy
ポリシー・アサーションの設定手順
設定ファイルの記述方法を説明します。

    (1) WSDLファイルと同じ内容の設定ファイルを作成します。サービス側で設定したポリシーは必要ありません。
    (2) wsdl:definitions要素の子要素としてWS-Securityのポリシー定義を追加します。追加するポリシーは、サービス側のバインディング定義と同じIdとしてください。

以下、バインディング定義の記述方法について説明します。オペレーション定義については、サービス側で設定したポリシーに追加する必要はありません。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://nec.webotx.com" name="webServiceService"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
    xmlns:wsp="http://www.w3.org/ns/ws-policy"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wowsp="http://nec.com/xml/ns/wsit/policy"
    xmlns:wo92spc="http://nec.com/ws-sx/wssp/client/201312"
    xmlns:wo92sp="http://nec.com/ws-sx/wssp/201312">
    ...
    <!--バインディング定義(サービス側と同じwsu:Id)-->
    <wsp:Policy wsu:Id="WebServiceServicePortBindingPolicy">
        <wsp:ExactlyOne>
            <wsp:All>
                 <!--CallbackHandlerを設定-->
                 <wo92spc:CallbackHandlerConfiguration wowsp:visibility="private">
                     <!--ユーザ名の値を処理するCallbackHandlerを設定-->
                     <wo92spc:CallbackHandler default="wsitUser" name="usernameHandler" />
                     <!--パスワードの値を処理するCallbackHandlerを設定-->
                     <wo92spc:CallbackHandler default="wsitUser" name="passwordHandler" />
                 </wo92spc:CallbackHandlerConfiguration>
                 <!--KeyStoreを設定-->
                 <wo92spc:KeyStore wowsp:visibility="private" location="C:\WebOTX\domains\domain1\config\keystore.jks" type="JKS" storepass="changeit" alias="webotx"/>
                 <!--TrustStoreを設定-->
                 <wo92spc:TrustStore wowsp:visibility="private" location="C:\WebOTX\domains\domain1\config\keystore.jks" type="JKS" storepass="changeit" peeralias="webotx"/>
            </wsp:All>
        </wsp:ExactlyOne>
    </wsp:Policy>
    ...
    <binding name="WebServiceServicePortBinding" type="tns:WebServiceService">
        <!--wsdl:binding要素の子要素としてwsp:PolicyReference要素を追加して、ポリシーを参照-->
        <wsp:PolicyReference URI="#WebServiceServicePortBindingPolicy"/>
        ...
    </binding>
    ...
</definitions>
WebOTX独自のアサーション
設定できるアサーションは、WS-SecurityPolicyで定義されているアサーションとWebOTX独自のアサーションがあります。
ここではWebOTX独自のアサーションについて説明します。

1.2.13.4. CallbackHandlerの実装

UsernameTokenによる認証を行う場合、動的にユーザ名・パスワードを取得するためにはCallbackHandlerを実装し、wsit-client.xmlのwo92spc:CallbackHandlerConfigurationに設定する必要があります。
CallbackHandlerはjavax.security.auth.callback.CallbackHandlerのインタフェースを実装して作成します。usernameHandlerとpasswordHandlerを個別のクラスとして実装することができますが、下記の実装例のように一つのクラスに両方のCallbackHandlerの機能を持たせることもできます。
以下に、CallbackHandlerの実装例を記載します。
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;
 
public class UsernamePasswordCallbackHandler implements CallbackHandler {
    public void handle(Callback[] callbacks) throws IOException ,UnsupportedCallbackException {
        for (int i =0; i < callbacks.length; i++) {
            if(callbacks[i] instanceof NameCallback) {
        
                String username = null;

                // ここにユーザ名取得のロジックを実装します。
                // 例では、単に固定文字列を代入します。
                username = "wsitUser";
	
                ((NameCallback)callbacks[i]).setName(username);

            } else if(callbacks[i] instanceof PasswordCallback){

                String password = null;

                // ここにパスワード取得のロジックを実装します。
                // 例では、単に固定文字列を代入します。
                password = "wsitPass";

                ((PasswordCallback)callbacks[i]).setPassword(password.toCharArray());

            } else {
                 throw new UnsupportedCallbackException(callbacks[i],"UnrecognizedCallback");
            }
        }
    }
}

1.2.13.5. Validatorの実装

UsernameTokenによる認証を行う場合、サービス側でユーザの認証処理を行うValidatorを実装し、サービス側設定ファイルのwo92sps:ValidatorConfigurationに設定する必要があります。 X509TokenやTimestampTokenについては、デフォルトのValidatorが内蔵されていますが、独自実装したものを使用することもできます。

UsernameToken用のValidatorは、セキュリティの設定によって実装すべきインタフェースが異なります。 以下に、それぞれの場合のValidator実装例を記載します。
SupportingTokensにUsernameTokenを定義している場合
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidationException;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidator;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.PlainTextPasswordRequest;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.Request;
 
public class TestPasswordValidator implements PasswordValidator {

    public boolean validate(Request request) throws PasswordValidationException {
        // ここにユーザ認証のロジックを実装します。
        // この例では、単に固定文字列と比較します。
        if(request instanceof PlainTextPasswordRequest){
            PlainTextPasswordRequest req = (PlainTextPasswordRequest) request;
            if("wsitUser".equals(req.getUsername()) && "wsitPass".equals(req.getPassword())){
                return true;
            }
        }
        return false;
    }

}
ハッシュパスワードを有効にしている場合
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.WsitDigestPasswordValidator;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.Request;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.DigestPasswordRequest;

public class TestWsitDigestPasswordValidator extends WsitDigestPasswordValidator {
    public void setPassword(Request request) {
        // requestにパスワードをセットします。
        // ここでは、単に固定文字列をセットします。
        if(request instanceof DigestPasswordRequest){
            ((DigestPasswordRequest)request).setPassword("wsitPass");
        }
    }
}
ProtectionTokenにUsernameTokenを定義している場合
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.DerivedKeyPasswordValidator;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidationException;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.Request;
import com.nec.webotx.webservice.xml.wss.impl.callback.PasswordValidationCallback.DerivedKeyPasswordRequest;

public class TestDerivedKeyPasswordValidator extends DerivedKeyPasswordValidator {

    public void setPassword(Request request) {
        // requestにパスワードをセットします。
        // ここでは、単に固定文字列をセットします。
        if(request instanceof DerivedKeyPasswordRequest){
            DerivedKeyPasswordRequest req = (DerivedKeyPasswordRequest)request;
            req.setPassword("wsitPass");
        }
    }
    public boolean validate(Request request) throws PasswordValidationException {
        // ここにユーザ認証のロジックを実装します。
        // この例では、単に固定文字列と比較します。
        if(request instanceof DerivedKeyPasswordRequest){
            DerivedKeyPasswordRequest req = (DerivedKeyPasswordRequest)request;
            if("wsitUser".equals(req.getUsername()) && "wsitPass".equals(req.getPassword())){
                return true;
            }
        }
        return false;
    }
}
TimestampToken用のValidator
import com.nec.webotx.webservice.xml.wss.impl.callback.TimestampValidationCallback;
import com.nec.webotx.webservice.xml.wss.impl.callback.TimestampValidationCallback.UTCTimestampRequest;
import com.nec.webotx.webservice.xml.wss.impl.callback.TimestampValidationCallback.TimestampValidator;
import com.nec.webotx.webservice.xml.wss.impl.callback.TimestampValidationCallback.TimestampValidationException;
import com.nec.webotx.webservice.xml.wss.impl.callback.TimestampValidationCallback.Request;

public class TestTimestampValidator implements TimestampValidator {
    public void validate(Request request) throws TimestampValidationException {
        boolean result = false;
        // ここにTimestampの検証ロジックを実装します。
        if(request instanceof UTCTimestampRequest){

        }
        return result;
    }
}

証明書用のValidator
import com.nec.webotx.webservice.xml.wss.impl.callback.CertificateValidationCallback;
import com.nec.webotx.webservice.xml.wss.impl.callback.CertificateValidationCallback.CertificateValidator;
import com.nec.webotx.webservice.xml.wss.impl.callback.CertificateValidationCallback.CertificateValidationException;
import java.security.cert.X509Certificate;

public class TestCertificateValidator implements CertificateValidator {
    public boolean validate(X509Certificate certificate) throws CertificateValidationException {
        boolean result = false;
        // ここに証明書の検証ロジックを実装します。
        return result;
    }
}