ポリシーの作成と使用
このトピックでは、InterSystems IRIS で WS-Policy サポートを使用する方法を説明します。WS-Policy により、使用する WS-Security ヘッダまたは必要な WS-Security ヘッダを指定できます。また、WS-Addressing ヘッダおよび MTOM の使用を指定することもできます ("Web サービスおよび Web クライアントの作成" を参照)。Web サービスまたは Web クライアントを直接編集するのではなく、個別のクラスでポリシーを作成します。ほとんどの場合、低レベルのプログラミングは必要ありません。
概要
InterSystems IRIS では、Web サービスまたは Web クライアントのポリシー (またはポリシーのコレクション) は、別々の構成クラス (%SOAP.ConfigurationOpens in a new tab のサブクラス) に含まれています。ポリシーは、クラスがコンパイルされたときに有効になります。
通常、コーディングの必要はありません。ただし、場合によってはその要素をポリシーにハードコードするのではなく、詳細をプログラムで指定してもかまいません。
構成クラスの影響
構成クラスをコンパイルすると、Web サービスまたはクライアントの以降の動作は次のような影響を受けます。
-
Web サービスまたはクライアントでは、ポリシーの詳細に従って、発信メッセージに追加のヘッダ要素が含まれます。
-
Web サービスまたはクライアントは、ポリシーに基づいて着信 SOAP メッセージを検証します。これには、必要に応じた着信メッセージの解読も含まれます。
-
Web サービスまたはクライアントは、オプションで、発信メッセージを必要に応じて暗号化します。
-
Web サービスでは、WSDL が自動的に影響を受けます。具体的には、<wsp:Policy> 要素が追加され、ネームスペース宣言に次の行が含まれるようになります。
xmlns:wsp="http://www.w3.org/ns/ws-policy"
構成クラスが複数のネームスペースにマップされている場合は、これらの各ネームスペースでコンパイルする必要があります。
WS-Security、WS-Addressing、および MTOM サポートとの関係
WS-Policy に対する InterSystems IRIS のサポートは、WS-Security、WS-Addressing、および MTOM に対する InterSystems IRIS のサポートに基づいています。以下の点に注意してください。
-
ポリシーにセキュリティ・ポリシーが含まれていない場合、InterSystems IRIS は、Web サービスまたは Web クライアントの SecurityOut プロパティを使用します (Web サービスまたは Web クライアントにセキュリティ・ヘッダ要素を手動で追加するには、別途説明しているように、SecurityOut プロパティに追加します)。
-
ポリシーにセキュリティ ポリシーが含まれている場合、InterSystems IRIS は、そのポリシーに関連する要素を除いて、Web サービスまたは Web クライアントの SecurityOut プロパティを無視します。
例えば、X.509 相互証明書セキュリティ・ポリシーを使用する場合、使用する InterSystems IRIS 資格情報セットをポリシー内で直接指定することも、%SYS.X509CredentialsOpens in a new tab のインスタンスを作成し、バイナリ・セキュリティ・トークンに格納して SecurityOut プロパティに追加することもできます。資格情報セットをポリシー内で直接指定しない場合、InterSystems IRIS は SecurityOut プロパティからバイナリ・セキュリティ・トークンを取得し、それを使用します。ただし、SecurityOut プロパティの他の要素はこのシナリオには適用されないため、InterSystems IRIS はそれらを無視します。
-
ポリシーで WS-Addressing を必要とする場合、InterSystems IRIS は WSADDRESSING クラス・パラメータを無視します。
ただし、AddressingOut プロパティが設定されていると、InterSystems IRIS は、指定の WS-Addressing ヘッダを使用します。それ以外の場合、WS-Addressing ヘッダの既定のセットが使用されます。
-
ポリシーで MTOM を必要とする場合、InterSystems IRIS は MTOMREQUIRED クラス・パラメータおよび MTOMRequired プロパティを無視します。
Web サービスと Web クライアントの関係
Web サービスにポリシーを添付する場合、すべてのクライアントは、そのポリシーに従うことが可能でなければなりません。Web サービス・ポリシーに代替ポリシーが何も含まれていない場合、クライアントには、Web サービスと同じポリシーが必要です。このとき、必要に応じて、サーバ側の証明書の代わりにクライアント側の証明書を使用します。
同様に、Web クライアントにポリシーを添付する場合、サービスは、そのポリシーに従うことが可能でなければなりません。
実際には、InterSystems IRIS でサービスとクライアントの両方を作成する場合、最も簡単な手順は次のとおりです。
-
Web サービス・クラスを作成します。
-
Web サービス構成クラスを、サービス・ポリシーと共に作成します。
-
クライアント構成クラスなどのクライアント・クラスを生成します。
これを実行した後、生成されたクライアント・クラスを検証し、必要に応じて変更を加えます。
通常、このためにラッパ・クラスも作成します。
これらのタスクについては、"Web サービスおよび Web クライアントの作成" を参照してください。
-
生成された構成クラスを検証し、必要に応じて変更を加えます。"生成されたポリシーの編集" を参照してください。
構成クラスの詳細は、"WS-Policy 構成クラスの詳細" を参照してください。
ポリシーの作成と添付
ポリシーを作成し、これを Web サービスまたは Web クライアントにアタッチするには、構成クラスを作成してコンパイルします。このクラスを作成するには、以下のような方法があります。
-
GeneratePolicyFromWSDL() メソッドの使用によって、WSDL から構成クラスのみを生成します。このオプションは、Web サービスまたは Web クライアントのクラスが既に存在していて、これを再生成しない場合に適用されます。
-
既存の Web サービスまたは Web クライアントの構成クラスを手動で作成します。詳細は、次のトピックを参照してください。
WSDL からポリシー・クラスを生成する場合、次のセクションで説明するように、ポリシー・クラスの編集が必要になる場合があります。
WSDL からのポリシーの生成
クライアント・クラスは既にあるものの、対応する構成クラスがない場合があります。これは、WSDL からクライアント・クラスを生成し、その後 WS-Policy 情報を含むように WSDL が変更された場合などに発生します。このような場合、以下のように、%SOAP.WSDL.ReaderOpens in a new tab のユーティリティ・メソッドを使用して、構成クラスのみを生成できます。
-
%SOAP.WSDL.ReaderOpens in a new tab のインスタンスを作成します。
-
そのインスタンスのプロパティを規定どおりに設定します。%SOAP.WSDL.ReaderOpens in a new tab については、クラス・ドキュメントを参照してください。
Process() メソッドは使用しないでください。
-
インスタンスの GeneratePolicyFromWSDL() メソッドを呼び出します。
このメソッドには、以下のシグニチャがあります。
method GeneratePolicyFromWSDL(wsdlURL As %String, clientWebServiceClass As %String, policyConfigClass As %String) as %Status
以下はその説明です。
-
wsdlURL は、ポリシーを含む WSDL の URL です。WSDL が 1 つのポートのみを指定することが前提となっています。
-
clientWebServiceClass は、Web クライアント・クラスの名前です。この Web クライアントが指定の WSDL と一致することを確認する必要があります。
-
policyConfigClass は、作成される構成クラスの名前です。
-
Web サービスの WSDL が指定するポリシーを含む Web サービス・クライアントの構成クラスが作成 (または上書き) されます。WSDL にポリシーがない場合は、空の構成クラスが作成されます。インスタンスの CompileClasses プロパティが 1 の場合は、この構成クラスがコンパイルされます。
生成されたポリシーの編集
構成クラスを WSDL から生成し、WSDL が InterSystems IRIS のこのインスタンスの外側にある場合、構成クラスを編集して、使用する証明書および SSL/TLS 構成に関する情報を組み込む必要があります。または、この情報を実行時に指定できます。
以下のテーブルに詳細を示します。
生成されたポリシーに含まれている要素 | 以下のことを実行します。 |
---|---|
<sp:HttpsToken> | クライアントに添付されたポリシーの場合、次のいずれかを実行します。
|
<sp:InitiatorToken> | クライアントに添付されたポリシーの場合、次のいずれかを実行します。
サービスに添付されたポリシーの場合、変更は必要ありません。 |
<sp:RecipientToken> | 以下のいずれかを行います。
|
<sp:SecureConversationToken> | 必要に応じて、"InterSystems 拡張属性の追加" の説明に従って、cfg:Lifetime 属性を追加します。既定の存続時間は 5 分です。 |
実行時の証明書の追加
Web サービスまたは Web クライアントが、プログラムで証明書を選択して含める必要がある場合は、以下の手順を実行します。
-
"プログラムによる資格情報セットの取得" の説明に従って、%SYS.X509CredentialsOpens in a new tab のインスタンスを取得します。
以下はその例です。
set credset=##class(%SYS.X509Credentials).GetByAlias(alias,password)
または以下のようにします。
set credset=..SecurityIn.Signature.X509Credentials
-
この資格情報セットの証明書を含む %SOAP.Security.BinarySecurityTokenOpens in a new tab のインスタンスを作成します。以下はその例です。
set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(credset)
credentials は、前の手順で取得した資格情報セットです。
これにより、シリアル化された Base 64 のエンコード形式の証明書を保持する <BinarySecurityToken> 要素を表すオブジェクトが返されます。
-
Web クライアントまたは Web サービスの SecurityOut プロパティの AddSecurityElement() メソッドを呼び出します。このメソッドの引数として、前に作成したバイナリ・セキュリティ・トークンを使用します。以下はその例です。
do ..SecurityOut.AddSecurityElement(bst)
2 つのバイナリ・セキュリティ・トークン (暗号化用と署名用) が必要な場合があります。このトークンは必ず適切な順序で追加してください。ポリシーがメッセージを暗号化してからこれに署名する場合、暗号化に使用するバイナリ・セキュリティ・トークンを追加してから署名に使用するバイナリ・セキュリティ・トークンを追加してください。逆に、ポリシーが署名してから暗号化する場合は、署名に使用するバイナリ・セキュリティ・トークンを先にする必要があります。
以下に、Web サービスの Web メソッドの例を示します。
//get credentials
set x509alias = "something"
set pwd = "password"
set credset = ##class(%SYS.X509Credentials).GetByAlias(x509alias,pwd)
//get certificate and add it as binary security token
set cert = ##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(credset)
do ..SecurityOut.AddSecurityElement(cert)
Web クライアントの場合、通常はプロキシ・クライアントを編集しないため、コードは多少異なります。
set client=##class(proxyclient.classname).%New()
//get credentials
set x509alias = "something"
set pwd = "password"
set credset = ##class(%SYS.X509Credentials).GetByAlias(x509alias,pwd)
//get certificate and add it as binary security token
set cert = ##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(credset)
do client.SecurityOut.AddSecurityElement(cert)
//invoke web method of client
実行時のポリシーの指定
InterSystems IRIS Web クライアントでは、実行時に使用するポリシーを指定できます。これにより、ポリシー構成クラスがオーバーライドされます。実行時にポリシーを指定するには、Web クライアント・インスタンスの PolicyConfiguration プロパティを設定します。この値は、以下の形式にする必要があります。
Configuration class name:Configuration name
ここで、Configuration class name は、このトピックで前述したように、ポリシー構成クラスの完全なパッケージおよびクラス名であり、Configuration name は、そのクラス内のポリシーの <configuration> 要素の name 属性です。
サポートされていないポリシーに対するコンパイル・エラーの抑制
既定では、構成クラスのコンパイル時に、InterSystems IRIS でサポートされていないポリシー式が構成に含まれていると、InterSystems IRIS はエラーを発行します。そのようなエラーを抑制するには、構成クラスで次のように設定します。
Parameter REPORTANYERROR=0;
WSDL から Web クライアントまたは Web サービスを生成するときに、InterSystems IRIS によって構成クラスも生成される場合は、そのクラスにこのパラメータ設定が含まれます。
サポートされている代替ポリシーが 1 つあれば、サポートされていない代替ポリシーは無視できます。