WebLogic Web サービス プログラマーズ ガイド
|
|
この章では、WebLogic Web サービスのセキュリティをコンフィグレーションする方法について説明します。
WebLogic Web サービスを保護するには、次の 3 種類のセキュリティの 1 つまたは複数をコンフィグレーションします。
「メッセージレベルのセキュリティ (デジタル署名と暗号化) のコンフィグレーション」を参照してください。
「転送レベルのセキュリティ (SSL) のコンフィグレーション : 主な手順」を参照してください。
「アクセス制御セキュリティのコンフィグレーション : 主な手順」を参照してください。
アクセス制御のセキュリティは、「誰が何を実行できるか」という質問の回答となります。まず、Web サービス (または Web サービスを実装するコンポーネント) にアクセスできるユーザ、グループ、またはロールのリストを指定します。次に、クライアント アプリケーションが Web サービスのオペレーションを呼び出そうとしたときに、そのクライアントは HTTP を使用してそれ自体の認証を WebLogic Server に対して行い、権限がある場合はクライアントはその呼び出しを続行することができます。アクセス制御セキュリティは、WebLogic Server のリソースのみ保護します。つまり、アクセス制御のセキュリティしかコンフィグレーションされていない場合は、クライアント アプリケーションと WebLogic Server の接続が保護されず、SOAP メッセージはプレーン テキストになります。
転送レベルのセキュリティでは、クライアント アプリケーションと WebLogic Server の間の接続がセキュア ソケット レイヤ (SSL) で保護されます。SSL では、ネットワーク接続している 2 つのアプリケーションが互いの ID を認証できるようにするとともに、アプリケーション間でやりとりされるデータを暗号化することでセキュアな接続が実現します。認証を使用すると、サーバとクライアント (省略可能) はネットワーク接続の相手側アプリケーションの ID を検証できます。ネットワーク経由で送信されるデータは暗号化されるので、予定されている宛先以外には解釈できません。
ただし、転送レベルのセキュリティでは接続そのものしか保護されません。つまり、クライアントと WebLogic Server の間にルータやメッセージ キューなどの仲介機能がある場合、その仲介機能は SOAP メッセージをプレーン テキストで取得します。仲介機能から次の送信先にメッセージが送信されたとき、その受信側では元々そのメッセージがどこから来たのかわかりません。また、SSL で使用される暗号化は「オール オア ナッシング」です。つまり、SOAP メッセージの全体が暗号化されるか、あるいはまったく暗号化されないかのいずれかになります。SOAP メッセージの一部だけ選択して暗号化することはできません。
メッセージレベルのセキュリティでは、SSL のすべてのセキュリティ上のメリットに、柔軟性と機能が追加されます。メッセージレベルのセキュリティはエンド ツー エンドです。つまり、SOAP メッセージは転送の過程でいくつ仲介機能があっても保護されます。接続だけでなく、SOAP メッセージそれ自体がデジタル署名および暗号化されます。さらに、メッセージの一部のみを署名または暗号化するように指定することもできます。
メッセージレベルのセキュリティでは、クライアント アプリケーションとそれが呼び出す Web サービスの間の SOAP メッセージに対してデジタル署名と暗号化の一方または両方を行うかどうかを指定します。
WebLogic Web サービスには、以下の 2004 年 4 月 6 日付の OASIS 標準 Web Services Security 1.0 仕様が実装されています。
これらの仕様は、主にセキュリティ トークンの伝播、メッセージの整合性、およびメッセージの機密性の 3 つのメカニズムを提供します。これらのメカニズムは別々に (ユーザ認証でのユーザ名セキュリティ トークンの受け渡しなど)、または組み合わせて (SOAP メッセージのデジタル署名と暗号化など) 使用できます。
以下の節では、メッセージレベルのセキュリティについて説明します。
「Web Services Security: SOAP Message Security」仕様の BEA 実装は、以下の使い方をフルサポートするように設計されています。
WebLogic Web サービスは、以下に説明するように、Web サービス セキュリティのコア仕様のすべての機能を実装するわけではありません。
詳細については、『WebLogic Security サービスの開発』の「ID アサーション プロバイダ」を参照してください。
web-services.xml デプロイメント記述子ファイルの <security> 要素では、WebLogic Web サービスのメッセージレベルのセキュリティがコンフィグレーションされているかどうかを指定します。具体的には、<security> 要素では次のことを記述します。
Web サービスをデプロイする場合、web-services.xml ファイルに指定されているセキュリティ情報は WSDL で公開されるので、その Web サービスを呼び出すクライアント アプリケーションは、SOAP メッセージに対してデジタル署名または暗号化を行う必要があるかどうかを知ることができます。
注意 :WSDL 1.1 にはセキュリティ情報を指定するための規格が含まれていないため、WebLogic Server は独自の方法でそのメッセージ セキュリティ情報を公開します。
次の図とそれに続く節では、メッセージ セキュリティ WebLogic Web サービスがデプロイされ、クライアント アプリケーションがそれを呼び出すときの処理の流れについて説明します。これらの節は、処理を実行する要素ごとに分かれています。
図 13-1 メッセージ セキュリティ WebLogic Web サービスのアーキテクチャ
クライアント アプリケーションは、クライアント キーストアから署名鍵ペアと証明書をロードし、weblogic.webservice.context.WebServiceContext API を使用して公開鍵と証明書を Web サービス セッションの属性として追加します。
注意 :クライアント アプリケーションは、そのクライアント キーストアからロードしたキー ペアと証明書を使用して SOAP リクエストにデジタル署名を行います。WebLogic Server は、そのキー ペアと証明書を使用して SOAP 応答を暗号化します。
C. WebLogic Web サービス クライアント実行時環境
クライアント アプリケーションが実行されると、クライアント実行時 JAR ファイルにパッケージ化されている Web サービス クライアント実行時環境は次のタスクを実行します。
注意 :クライアント実行時環境は、WebLogic Server に応答を送信する直前、およびすべてのクライアント ハンドラが実行された直後にすべての暗号化および署名タスクを実行します。
WebLogic Server は、クライアントに SOAP 応答を返送し、その SOAP 応答にデジタル署名または暗号化を行うことが必要な場合、最初に SOAP リクエストを送信したときの WebLogic Web サービス クライアント実行時環境と同じ手順に従います (「C. WebLogic Web サービス クライアント実行時環境」を参照)。ただし、次の点が異なります。
WebServiceContext (クライアント キーストアからロードしたもの) のプライベート キーを使用して応答を復号化します。web-services.xml デプロイメント記述子ファイルに明示的に指定されている場合にのみ、SOAP 応答にユーザ名トークンを組み込む。通常、クライアント アプリケーションは ID を断定する必要がないので、これは不要です。WebLogic Web サービスのメッセージレベルのセキュリティをコンフィグレーションするには、デジタル署名の取得、キーストアとユーザの作成などの標準的なタスクに加え、web-services.xml ファイルのセキュリティ情報の更新といった Web サービス固有のタスクを実行します。
WebLogic Web サービス、およびサービスを呼び出すクライアントのメッセージレベルのセキュリティをコンフィグレーションするには、次の手順に従います。この手順の一部については、後の節で詳しく説明します。
注意 :次の手順は、WebLogic Web サービスをすでに実装およびアセンブルし、デジタル署名および暗号化を使用するように Web サービスを更新することを前提としています。
分かりやすくするために、デジタル署名用のキー ペアと証明書の名前は digSigKey、パスワードは digSigKeyPassword で、暗号化用のキーペアと証明書の名前は encryptKey、パスワードは encryptKeyPassword であるとします。
この手順には、Cert Gen ユーティリティまたは Sun Microsystem の keytool ユーティリティを使用します。開発が目的の場合は、keytool ユーティリティを使用すると簡単に開始できます。
詳細については、「プライベート キー、デジタル証明書、信頼性のある認証局の取得」を参照してください。
SSL 用に WebLogic Server をすでにコンフィグレーションしてある場合は、WebLogic Web サービス データのセキュリティのためにも使用できる ID キーストアがすでに作成されています。
この手順には、WebLogic の ImportPrivateKey ユーティリティおよび Sun Microsystem の keytool ユーティリティを使用できます。開発が目的の場合は、keytool ユーティリティを使用すると簡単に開始できます。
詳細については、「キーストアの作成およびプライベート キーと信頼性のある認証局のキーストアへのロード」を参照してください。
詳細については、「キーストアのコンフィグレーション」を参照してください。
この手順には、Cert Gen ユーティリティまたは Sun Microsystem の keytool ユーティリティを使用します。開発が目的の場合は、keytool ユーティリティを使用すると簡単に開始できます。
このマニュアルの後の節では、パスワードが client_keystore_password の client_keystore というクライアント キーストアを作成した場合を想定しています。
詳細については、「プライベート キー、デジタル証明書、信頼性のある認証局の取得」を参照してください。
この手順には、Sun Microsystem の keytool ユーティリティを使用します。
このマニュアルの後の節では、パスワードが client_key_password の client_key というキー ペアを作成した場合を想定しています。
WebLogic Server には、デフォルトの ID アサータ プロバイダを使用してコンフィグレーションされた myrealm という名前のデフォルトのセキュリティ レルムがあります。独自の ID アサータ プロバイダをコンフィグレーションする必要がない場合は、このデフォルトのセキュリティ レルムを使用します。ただし、追加のコンフィグレーション タスクを実行し、デフォルトの ID アサータ プロバイダがメッセージ保護された WebLogic Web サービスで正しく動作していることを確認する必要があります。
詳細については、「myrealm セキュリティ レルムに対して ID アサータ プロバイダをコンフィグレーションする」を参照してください。
詳細については、「ユーザの作成」を参照してください。
このマニュアルの後の節では、パスワードが auth_user_password の auth_user というユーザを作成した場合を想定しています。
servicegen Ant タスクの呼び出しを含む build.xml ファイルを更新し、Web サービスをビルドする <service> 要素に <security> 子要素を追加します。暗号化鍵ペア、デジタル署名鍵ペア、対応するパスワードなどの情報を指定します。注意 :servicegen Ant タスクでは Web サービスに対する暗号化およびデジタル署名のコンフィグレーションを大まかにしか制御できません。暗号化する、またはデジタル署名する SOAP メッセージ内のデータを細かく制御する場合は、web-services.xml ファイルを手動で更新する必要があります。詳細については、「web-services.xml ファイルのセキュリティ情報を更新する」を参照してください。
servicegen の使い方の詳細については、「servicegen build.xml ファイルを更新する」を参照してください。
web-services.xml ファイルにある各パスワードを暗号化します。通常この手順は、プロダクション モードで Web サービスをデプロイする場合のみ実行します。詳細については、「web-services.xml ファイルのパスワードを暗号化する」を参照してください。
詳細については、「データ保護された Web サービスを呼び出すように Java クライアントを更新する」を参照してください。
メッセージ保護された WebLogic Web サービスでは、デフォルトの myrealm セキュリティ レルムに対してコンフィグレーションされた、デフォルトの ID アサータ プロバイダを使用できます。しかし、そのためにはさらにいくつかのコンフィグレーションタスクを実行する必要があります。
ID アサータのコンフィグレーションの詳細については、以下を参照してください。
次の例に示すように、Web サービスをビルドする <service> 要素に <security> 子要素を追加して、servicegen Ant タスクの呼び出しを含む build.xml ファイルを更新します。デフォルトでは、servicegen は、特定の要素ではなく SOAP 本文全体がデジタル署名、または暗号化されるように指定します。特定の要素をデジタル署名または暗号化する方法については、後の節で説明します。
注意 :分かりやすくするため、次の servicegen の build.xml ファイルのパスワードは、クリア テキスト形式を使用しています。しかし、セキュリティのため、ファイルに実際にパスワードを格納するのではなく、<input> Ant タスクを使用してパスワードの入力を求めるように、build.xml ファイルを更新することをお勧めします。<input> Ant タスクの使い方の詳細については、『Apache Ant User Manual』を参照してください。
<servicegen
destEar="ears/myWebService.ear"
warName="myWAR.war"
contextURI="web_services" >
<service
ejbJar="jars/myEJB.jar"
targetNamespace="http://www.bea.com/examples/Trader"
serviceName="TraderService"
serviceURI="/TraderService"
generateTypes="True"
expandMethods="True" >
<security
signKeyName="digSigKey"signKeyPass="digSigKeyPassword"
encryptKeyName="encryptKey"
encryptKeyPass="encryptKeyPassword"
/>
</service>
</servicegen>
上記の build.xml ファイルでは、web-services.xml デプロイメント記述子ファイルにある次のようなメッセージレベルのセキュリティ情報を含む Web サービスを servicegen がアセンブルするように指定されています。
signKeyName および signKeyPass 属性は、SOAP リクエストおよび応答の本文をデジタル署名する必要があることを指定しています。WebLogic Server は、名前 digSigKey、パスワード digSigKeyPassword を使用してそのキーストアからキー ペアと証明書を取得して、SOAP 応答にデジタル署名を行うために使用します。このキー ペアと証明書は、「メッセージレベルのセキュリティのコンフィグレーション : 主な手順」の手順 1 で追加しています。encryptKeyName および encryptKeyPass 属性は、SOAP リクエストおよび応答の本文を暗号化する必要があることを指定しています。WebLogic Server は、名前 encryptKey、パスワード encryptKeyPassword を使用してそのキーストアからキー ペアと証明書を取得して、SOAP リクエストを暗号化および復号化するために使用します。このキー ペアと証明書は、「メッセージレベルのセキュリティのコンフィグレーション : 主な手順」の手順 1 で追加しています。注意 :「web-services.xml ファイルのパスワードを暗号化する」で説明されているように、weblogic.webservice.encryptpass ユーティリティを使用して web-services.xml ファイルのパスワードを暗号化します。
servicegen Ant タスクの <security> 要素を使用して Web サービスにセキュリティを追加した場合は、Web サービスのすべてのオペレーションに対して SOAP 本文全体が暗号化され、デジタル署名されます。暗号化およびデジタル署名は、SOAP メッセージのリクエストと応答の両方に対して発生します。
SOAP メッセージの特定の要素がデジタル署名、または暗号化されるように指定するには、WebLogic Web サービスの web-services.xml ファイルを手動で更新します。詳細については、「web-services.xml ファイルのセキュリティ情報を更新する」を参照してください。
servicegen Ant タスクでは、生成された web-services.xml デプロイメント記述子ファイルに、最低限のデフォルトのメッセージレベルのセキュリティ情報が追加されます。特に、デフォルトの情報により、Web サービスのすべてのオペレーションについて、特定の要素ではなく、SOAP 本文全体がデジタル署名または暗号化されるように指定されます。通常はこのデフォルトの動作が適していますが、一部の要素に対してだけデジタル署名または暗号化するように指定し、オペレーションごとに異なるセキュリティ仕様を指定したい場合もあります。この場合は、web-services.xml ファイルを手動で更新する必要があります。
「servicegen build.xml ファイルを更新する」の build.xml ファイルを使用して servicegen を実行した場合、生成される web-services.xml ファイルの <security> 要素は次の例のようになります。太字のセクションについてはこの例の後に説明します。
<web-service>
...
<security>
<signatureKey>
<name>digSigKey</name>
<password>digSigKeyPassword</password>
</signatureKey>
<encryptionKey>
<name>encryptKey</name>
<password>encryptKeyPassword</password>
</encryptionKey>
<spec:SecuritySpec xmlns:spec="http://www.openuri.org/2002/11/wsse/spec"
Namespace="http://schemas.xmlsoap.org/ws/2002/07/secext"
Id="default-spec">
<spec:BinarySecurityTokenSpec
xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext"
EncodingType="wsse:Base64Binary"
ValueType="wsse:X509v3">
</spec:BinarySecurityTokenSpec>
<spec:SignatureSpec
SignatureMethod="http://www.w3.org/2000/09/xmldsig#rsa-sha1"
SignBody="true"
CanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#">
</spec:SignatureSpec>
<spec:EncryptionSpec
EncryptBody="true"
EncryptionMethod="http://www.w3.org/2001/04/xmlenc#tripledes-cbc">
</spec:EncryptionSpec>
</spec:SecuritySpec>
</security>
...
<operations>
<operation
name="myOperation" method="myMethod" component="ejbComp"
in-security-spec="default-spec" out-security-spec="default-spec">
...
</operation>
</operations>
...
</web-service>
注意 :上記の例の spec プレフィックスは、web-services.xml デプロイメント記述子ファイルのセキュリティ情報に必要なネームスペース プレフィックスです。XML ネームスペースの詳細については、『Namespaces in XML』を参照してください。
上記の web-services.xml の <signatureKey> および <encryptKey> 要素は、それぞれデジタル署名と暗号化用の鍵をサーバのキーストアから取得するためのユーザ名とパスワードを指定します。
<spec:SecuritySpec> 要素の Id="default-spec" 属性は、これがデフォルトのセキュリティ仕様であることを指定します。デフォルトによって、Web サービスのあらゆるオペレーションを呼び出すための SOAP リクエストおよび応答は、このセキュリティ仕様に定義されている情報に従う必要があります。これは、各 <operation> 要素の in-security-spec="default-spec" および out-security-spec="default-spec" 属性で指定します。
上記の <spec:SignatureSpec> および <spec:EncryptionSpec> 要素の SignBody="true" および EncryptBody="true" 属性は、すべてのオペレーションについて SOAP 本文全体に対してデジタル署名と暗号化を行う必要があることを指定しています。
以下の節では、web-services.xml ファイルを更新してより詳細なメッセージ セキュリティを指定する方法について説明します。
特定の要素に対してデジタル署名または暗号化を行うように指定するには、web-services.xml ファイルの対応する <spec:SignatureSpec> または <spec:EncryptionSpec> 要素に、1 つまたは複数の <spec:ElementIdentifier> 子要素を追加します。
たとえば、SOAP 本文全体に加え、ローカル名が Timestamp の SOAP ヘッダの要素をデジタル署名する場合を考えます。このコンフィグレーションを指定するには、次のように <spec:ElementIdentifier> 子要素を <spec:SignatureSpec> 要素に追加します。
<spec:SignatureSpec
SignatureMethod="http://www.w3.org/2000/09/xmldsig#rsa-sha1"
SignBody="true"
CanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#">
<spec:ElementIdentifier
LocalPart="Timestamp"
Namespace="http://www.bea.com/examples/security" />
</spec:SignatureSpec>
この例は、<spec:ElementIdentifier> 要素の LocalPart および Namespace 属性を使用して、SOAP メッセージの Timestamp 要素がデジタル署名されるように識別する方法を示しています。LocalPart 属性を、暗号化する SOAP メッセージの要素名と同じ名前に設定し、Namespace 属性をそのネームスペースに設定します。要素の正確な名前およびネームスペースを取得するには、次のようにします。
wsdlgen Ant タスクを使用します。詳細については、「wsdlgen」を参照してください。特定の要素が暗号化されるように指定する方法も非常に似ています。たとえば、SOAP メッセージの本文ではなく CreditCardNumber 要素だけを暗号化するには、次のように <spec:EncryptionSpec> 要素を更新します。
<spec:EncryptionSpec
EncryptionMethod="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" >
<spec:ElementIdentifier
LocalPart="CreditCardNumber"
Namespace="http://www.bea.com/examples/security" />
</spec:EncryptionSpec>
<security> 要素、およびこの節で扱ったそのすべての子要素の詳細については、「WebLogic Web サービス デプロイメント記述子の要素」を参照してください。
web-services.xml デプロイメント記述子ファイルの <security> 要素には、ゼロ個以上の <spec:SecuritySpec> 要素を挿入できます。これらの要素では、特定の SOAP メッセージのセキュリティ要件 (署名の対象、暗号化の対象、組み込むトークンなど) を指定します。
通常、各 <spec:SecuritySpec> 要素には、それぞれをユニークに識別するための Id 属性が設定されます。web-services.xml ファイルの <operations> セクションで、各 <operation> 要素は、固有のセキュリティ仕様を参照できます。そのためには、オペレーションの in-security-spec または out-security-spec 属性を関連する Id 値に設定します。in-security-spec 属性によって参照されるセキュリティ仕様は SOAP リクエストに適用され、out-security-spec 属性によって参照されるセキュリティ仕様は SOAP 応答に適用されます。
<spec:SecuritySpec> 要素に Id 属性が存在しないか、または default-spec という値が割り当てられている場合、そのセキュリティ仕様はデフォルト仕様として扱われ、仕様を明示的に参照していないすべてのオペレーションに適用されます。定義できるデフォルト仕様は 1 つだけです。複数のデフォルト仕様が web-services.xml ファイルに定義されている場合、Web サービスはデプロイされません。
servicegen Ant タスクは、web-services.xml ファイルに (Id="default-spec" 属性を使用して) デフォルトのセキュリティ仕様を常に生成します。このセキュリティ仕様は、すべてのオペレーションのすべての SOAP メッセージに適用されます。個々の <operation> 要素には、このセキュリティ仕様への直接の参照は指定されません (必要としないため)。
たとえば、Web サービス用に次の 2 つのセキュリティ仕様を定義したとします。
<web-service>
...
<security>
...
<spec:SecuritySpec xmlns:spec="http://www.openuri.org/2002/11/wsse/spec"
Namespace="http://schemas.xmlsoap.org/ws/2002/07/secext"
Id="encrypt-only">
<spec:EncryptionSpec
...
</spec:EncryptionSpec>
</spec:SecuritySpec>
<spec:SecuritySpec xmlns:spec="http://www.openuri.org/2002/11/wsse/spec"
Namespace="http://schemas.xmlsoap.org/ws/2002/07/secext"
Id="sign-only">
<spec:SignatureSpec
...
</spec:SignatureSpec>
</security>
...
</web-service>
上の例では、encrypt-only セキュリティ仕様では暗号化だけが必要となり、sign-only セキュリティ仕様ではデジタル署名だけが必要となります。次の例に示すように、関連する <operation> 要素の in-security-spec 属性と out-security-spec 属性を使用することで、特定のオペレーションについてこれらのセキュリティ仕様を組み合わせることができます。
<operations>
<operation
name="operationOne" method="methodOne" component="ejbComp"
in-security-spec="encrypt-only"
out-security-spec="encrypt-only">
...
</operation>
<operation
name="operationTwo" method="methodTwo" component="ejbComp"
in-security-spec="sign-only">
...
</operation>
</operations>
上の例は、operationOne オペレーションの SOAP リクエストと SOAP 応答をどちらも暗号化する必要があるが、デジタル署名は行う必要がないことを示しています。また、operationTwo の SOAP リクエストにデジタル署名を行う必要がありますが (暗号化の必要はない)、SOAP 応答にはセキュリティは必要ありません。
<security> および <operation> 要素の詳細については、「WebLogic Web サービス デプロイメント記述子の要素」を参照してください。
メッセージレベルのセキュリティがコンフィグレーションされている WebLogic Web サービスをクライアント アプリケーションが呼び出す場合、WebLogic Server は SOAP リクエストにタイムスタンプを組み込むことを要求し、SOAP 応答にタイムスタンプを追加します。デフォルトでは、WebLogic Server は次のことを行います。
WebLogic Web サービスのデフォルトのタイムスタンプ機能を変更するには、web-services.xml デプロイメント記述子の <security> 要素に <timestamp> 子要素を追加します。
次の web-services.xml の抜粋は、タイムスタンプ機能をコンフィグレーションする例を示しています。
<web-service>
...
<security>
<timestamp>
<clocks-synchronized>true</clocks-synchronized>
<clock-precision>30000</clock-precision>
<require-signature-timestamp>false</require-signature-timestamp>
<generate-signature-timestamp>true</generate-signature-timestamp>
<inbound-expiry>120000</inbound-expiry>
<outbound-expiry>30000</outbound-expiry>
</timestamp>
...
</security>
...
</web-service>
上の <timestamp> 要素では、関連する Web サービス オペレーションが呼び出されたときのタイムスタンプの機能が次のように指定されています。
<clock-precision> 要素の値は、WebLogic Server と Web サービス オペレーションを呼び出すクライアント アプリケーションとのクロック同期の精度を表しています。WebLogic Server は、この値を使用してすべてのタイムスタンプを一貫した方法で丸めます。たとえば、クロック精度が 30000 ミリ秒 (30 秒) であるとします。この場合、すべてのタイムスタンプは 30 秒単位で最も近い時刻に丸められます。たとえば、この例の場合、WebLogic Server は 12:00:10 と 11:59:50 を同じ時刻 (12:00:00) に丸め、2 つのタイムスタンプを等しいものとして扱います。
web-services.xml デプロイメント記述子の各タイムスタンプ要素に対応するシステム プロパティがクライアント側に存在します。これらのプロパティは、クライアント アプリケーションで設定できます。詳細については、「Web サービスのシステム プロパティの使い方」を参照してください。
<timestamp> 要素とそのすべての子要素の詳細については、「WebLogic Web サービス デプロイメント記述子の要素」を参照してください。
weblogic.webservice.encryptpass ユーティリティを使用して、web-services.xml ファイルのキー ペア パスワード (暗号化およびデジタル署名に使用) を暗号化します。
web-services.xml ファイルの <security> 要素を編集してプレーン テキストのパスワードを暗号化すると、weblogic.webservice.encryptpass ユーティリティにより、指定された EAR ファイル (または展開ディレクトリ) が更新されます。
このパスワードを解読できるのは、ユーティリティに指定した WebLogic Server ドメインのみです。つまり、たとえば encryptpass ユーティリティで指定したドメインとは別の WebLogic Server ドメインで EAR ファイルをデプロイする場合は、プレーン テキストのパスワードを含む EAR ファイルに対して、新しいドメインを指定してユーティリティを再実行する必要があります。
Windows NT では、ドメイン ディレクトリにある setEnv.cmd コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME\user_projects\domains\domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。
UNIX では、ドメイン ディレクトリにある setEnv.sh コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME/user_projects/domains/domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。
config.xml ファイルがあります。java weblogic.webservice.encryptpassoptionsear_or_dir
options は、表 13-1 で説明する 1 つまたは複数のオプションを指す。ear_or_dir は、web-services.xml ファイル内のパスワードを暗号化する EAR ファイル (または展開ディレクトリ) の絶対パス名を指す。java weblogic.webservice.encryptpass -serviceName Hello -verbose ears/myService.ear
デジタル署名または暗号化を使用する WebLogic Web サービスまたは非 WebLogic Web サービスを呼び出すように Java クライアント アプリケーションを更新するには、次の手順に従います。
WL_HOME/server/lib/wsse.jar を含めます。WL_HOME は、WebLogic Platform の最上位ディレクトリです。このクライアント JAR ファイルには、Web サービス セキュリティ (WS-Security) 仕様の BEA 実装が含まれます。詳細については、「データ保護された WebLogic Web サービスを呼び出すように Java コードを記述する」を参照してください。
セキュアな非 WebLogic Web サービスの呼び出し例については、「データ保護された非 WebLogic Web サービスを呼び出すように Java コードを記述する」を参照してください。
デジタル署名および暗号化についての詳細情報を取得するために設定できるシステム プロパティの詳細については、「クライアント アプリケーションを実行する」を参照してください。
次の例は、メッセージ保護された WebLogic Web サービスを呼び出す Java クライアント アプリケーションを示しています。セキュリティ固有のコードは太字に表示し、例の後で説明します。
import java.io.IOException;
import java.io.FileInputStream;
import javax.xml.rpc.ServiceException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.UnrecoverableKeyException;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import weblogic.webservice.context.WebServiceContext;
import weblogic.webservice.context.WebServiceSession;
import weblogic.webservice.core.handler.WSSEClientHandler;
import weblogic.xml.security.UserInfo;
public class Main{
private static final String CLIENT_KEYSTORE = "client_keystore";
private static final String KEYSTORE_PASS = "client_keystore_password";
private static final String CLIENT_KEYNAME = "client_key";
private static final String CLIENT_KEYPASS = "client_key_password";
private static final String AUTHENTICATION_USER = "auth_user";
private static final String AUTHENTICATION_USER_PASS = "auth_user_password";
public static void main( String[] args ){
if( args.length == 1 ){
new Main( args[0] );
}else{
throw new IllegalArgumentException( "URL of the service not specified" );
}
}
public Main( String wsdlUrl ){
try{
HelloWorldService service = new HelloWorldService_Impl( wsdlUrl );
HelloWorldServicePort port = service.getHelloWorldServicePort();
WebServiceContext context = service.context();
X509Certificate clientcert = getCertificate(CLIENT_KEYNAME, CLIENT_KEYSTORE);
PrivateKey clientprivate = (PrivateKey)getPrivateKey(CLIENT_KEYNAME, CLIENT_KEYPASS,CLIENT_KEYSTORE);
WebServiceSession session = context.getSession();
session.setAttribute(WSSEClientHandler.CERT_ATTRIBUTE, clientcert);
session.setAttribute(WSSEClientHandler.KEY_ATTRIBUTE, clientprivate);
UserInfo ui = new UserInfo(AUTHENTICATION_USER, AUTHENTICATION_USER_PASS);
session.setAttribute(WSSEClientHandler.REQUEST_USERINFO, ui);
World world = port.helloComplexWorld();
System.out.println( world );
}catch( IOException e ){
System.out.println( "Failed to create web service client:" + e );
}catch( ServiceException e ){
System.out.println( "Failed to create web service client:" + e );
}catch( KeyStoreException e ){
System.out.println( "Failed to create web service client:" + e );
}catch( CertificateException e ){
System.out.println( "Failed to create web service client:" + e );
}catch( UnrecoverableKeyException e ){
System.out.println( "Failed to create web service client:" + e );
}catch( NoSuchAlgorithmException e ){
System.out.println( "Failed to create web service client:" + e );
}
}
private Key getPrivateKey( String keyname, String password, String keystore)
throws IOException, KeyStoreException, NoSuchAlgorithmException,
CertificateException, UnrecoverableKeyException{
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystore), KEYSTORE_PASS.toCharArray());
Key result = ks.getKey(keyname, password.toCharArray());
return result;
}
private static X509Certificate getCertificate(String keyname, String keystore)
throws IOException, KeyStoreException, NoSuchAlgorithmException,
CertificateException {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystore), KEYSTORE_PASS.toCharArray());
X509Certificate result = (X509Certificate) ks.getCertificate(keyname);
return result;
}
}
Service オブジェクトを作成したら、WebLogic Web サービス コンテキストを取得する。WebServiceContext context = service.context();
注意 :weblogic.webservice.context.WebServiceContext クラスは、独自仕様の WebLogic Web サービス クライアント API です。
X509Certificate clientcert =
getCertificate(CLIENT_KEYNAME, CLIENT_KEYSTORE);
PrivateKey clientprivate =
(PrivateKey)getPrivateKey(CLIENT_KEYNAME, CLIENT_KEYPASS,CLIENT_KEYSTORE);
WebServiceSession session = context.getSession();
注意 :weblogic.webservice.context.WebServiceSession クラスは、WebLogic Web サービス クライアント API です。
WebServiceSession 属性を使用して、プライベート キーおよびデジタル証明書を、呼び出されている WebLogic Web サービスに渡す。session.setAttribute(WSSEClientHandler.CERT_ATTRIBUTE, clientcert);
session.setAttribute(WSSEClientHandler.KEY_ATTRIBUTE, clientprivate);
UserInfo オブジェクトを作成し、WebServiceSession の属性を使用して、呼び出されている WebLogic Web サービスに情報を渡す。UserInfo ui = new UserInfo(AUTHENTICATION_USER, AUTHENTICATION_USER_PASS);
session.setAttribute(WSSEClientHandler.REQUEST_USERINFO, ui);
注意 :weblogic.xml.security.UserInfo クラスは、WebLogic Web サービス クライアント API です。
getPrivateKey() および getCertificate() は、クライアントのローカル キーストアから情報を取得する方法を示した単純な例。クライアント キーストアの設定方法により、この情報を取得する方法は異なります。 この節で説明した WebLogic Web サービス API の詳細については、Javadoc を参照してください。
次の例は、基本的に前節の例と同じですが、非 WebLogic Web サービス (.NET など) を呼び出す Java クライアント アプリケーションの記述方法を示しています。
この例では、weblogic.xml.security.wsse および weblogic.xml.security.specs API を使用してユーザ Tokens、X.509 Tokens、EncryptionSpecs、および SignatureSpecs (WebLogic クライアント API が非 WebLogic Web サービスを呼び出す SOAP リクエストに適切な <wsse:Security> 要素を作成するために使用する) を作成します。ユーザ Token オブジェクトにはユーザ名とパスワードが含まれ、X.509 Token オブジェクトには証明書とプライベート キー (省略可能) が含まれます。
注意 :Web サービスの WSDL にセキュリティ情報を指定するための標準の方法は現在のところ存在しません。このため、Web サービス プロバイダに問い合わせて、非 WebLogic Web サービスを呼び出すときに署名および暗号化する必要があるものを確認してください。
この例の関連セクションは太字で示してあります (この例に続いて説明があります)。
import java.io.IOException;
import java.io.FileInputStream;
import java.util.List;
import java.util.ArrayList;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateException;
import javax.xml.rpc.ServiceException;
import javax.xml.namespace.QName;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.HandlerRegistry;
import weblogic.webservice.context.WebServiceContext;
import weblogic.webservice.core.handler.WSSEClientHandler;import weblogic.xml.security.wsse.Security;import weblogic.xml.security.SecurityAssertion;
import weblogic.xml.security.wsse.Token;
import weblogic.xml.security.wsse.SecurityElementFactory;
import weblogic.xml.security.specs.EncryptionSpec;
import weblogic.xml.security.specs.SignatureSpec;
import examples.security.basicclient.BasicPort;
import examples.security.basicclient.Basic_Impl;
import examples.security.basicclient.Basic;
public class Client {
private static final String CLIENT_KEYSTORE = "client.keystore";
private static final String KEYSTORE_PASS = "gumby1234";
private static final String KEY_ALIAS = "joe";
private static final String KEY_PASSWORD = "myKeyPass";
private static final String SERVER_KEY_ALIAS = "myServer";
private static final String USERNAME = "pete";
private static final String USER_PASSWORD = "myPassword";
public static void main(String[] args)
throws IOException, ServiceException, Exception {
{
final KeyStore keystore = loadKeystore(CLIENT_KEYSTORE, KEYSTORE_PASS);
Basic service = new Basic_Impl();
WebServiceContext context = service.context();
// WSSE クライアント ハンドラをサービスのハンドラ チェーンに追加
HandlerRegistry registry = service.getHandlerRegistry();
List list = new ArrayList();
list.add(new HandlerInfo(WSSEClientHandler.class, null, null));
registry.setHandlerChain(new QName("basicPort"), list);
// クライアントの資格をロード
X509Certificate clientcert;
clientcert = getCertificate(KEY_ALIAS, keystore);
PrivateKey clientprivate;
clientprivate = getPrivateKey(KEY_ALIAS, KEY_PASSWORD, keystore);
// サーバの証明書をロード
X509Certificate serverCert = getCertificate(SERVER_KEY_ALIAS, keystore);
// configure the Security element for the service.SecurityElementFactory factory =
SecurityElementFactory.getDefaultFactory();
Token x509token = factory.createToken(clientcert, clientprivate);
Token userToken = factory.createToken(USERNAME, USER_PASSWORD);
EncryptionSpec encSpec = EncryptionSpec.getDefaultSpec();
SignatureSpec sigSpec = SignatureSpec.getDefaultSpec();
Token serverToken = null;
// サーバの証明書用のトークンを作成。PrivateKey は、なしserverToken = factory.createToken(serverCert, null);
Security security = factory.createSecurity(/* role */ null);
// セキュリティ ヘッダにタイムスタンプを追加。 作成時刻は現在時刻となり
// 有効期限はない
security.addTimestamp();
// ヘッダにユーザ名/パスワードを UsernameToken として追加
security.addToken(userToken);
security.addSignature(x509token, sigSpec);
// 署名検証用のクライアント証明書と応答用の暗号を追加
// 署名の後に追加する必要があるsecurity.addToken(x509token);
security.addEncryption(serverToken, encSpec);
BasicPort port = service.getbasicPort();
// セキュリティ要素をリクエストに追加
context.getSession().setAttribute("weblogic.webservice.security.request",
security);
String result = null;
result = port.helloback();
System.out.println(result);
// view the assertions from processing the server's response...
SecurityAssertion[] assertions = (SecurityAssertion[])
context.getSession().getAttribute("weblogic.webservice.security.assertions.response");
for (int i = 0; i < assertions.length; i++) {
SecurityAssertion assertion = assertions[i];
System.out.println(assertion);
}
}
}
private static KeyStore loadKeystore(String filename, String password)
throws KeyStoreException, IOException, NoSuchAlgorithmException,
CertificateException {
final KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(filename), password.toCharArray());
return ks;
}
private static PrivateKey getPrivateKey(String alias, String password,
KeyStore keystore)
throws Exception {
PrivateKey result =
(PrivateKey) keystore.getKey(alias, password.toCharArray());
return result;
}
private static X509Certificate getCertificate(String alias, KeyStore keystore)
throws Exception {
X509Certificate result = (X509Certificate) keystore.getCertificate(alias);
return result;
}
}
HandlerRegistry registry = service.getHandlerRegistry();
List list = new ArrayList();
list.add(new HandlerInfo(WSSEClientHandler.class, null, null));
registry.setHandlerChain(new QName("basicPort"), list);
weblogic.xml.security.wsse.SecurityElementFactory を使用して、SOAP メッセージの <wsse:Security> 要素を表すオブジェクトを作成する。また、次のコードに示すように、このファクトリを使用してユーザと X.509 トークンを作成します。SecurityElementFactory factory =
SecurityElementFactory.getDefaultFactory();
Token x509token = factory.createToken(clientcert, clientprivate);
Token userToken = factory.createToken(USERNAME, USER_PASSWORD);
Token serverToken = null;
Security security = factory.createSecurity(/* role */ null);
EncryptionSpec オブジェクトと SignatureSpec オブジェクトを作成する (省略可能)。 EncryptionSpec encSpec = EncryptionSpec.getDefaultSpec();
SignatureSpec sigSpec = SignatureSpec.getDefaultSpec();
addTimestamp() メソッドを使用すると、SOAP メッセージ内のセキュリティ要素にタイムスタンプおよび有効期限 (省略可能) を追加できる。次に挙げる Security.addTimestamp() メソッドの 4 つのバリエーションの 1 つを使用します。addTimestamp() - 現在時刻に作成時のタイムスタンプを設定する (有効期限なし)。addTimestamp(long) - 作成時のタイムスタンプを現在時刻に、有効期限を作成時のタイムスタンプから long 型のミリ秒数後に設定する。addTimestamp(java.util.Calendar) - 作成時のタイムスタンプを Calendar パラメータの値に設定する (有効期限なし)。addTimestamp(java.util.Calendar, java.util.Calendar) - 作成時のタイムスタンプを最初の Calendar パラメータの値に、有効期限を 2 つ目の Calendar パラメータの値に設定する。addToken()、addSignature()、および addEncryption() メソッドを使用してセキュリティ要素にトークンを追加し、SOAP メッセージに対して暗号化またはデジタル署名を行うかどうかを指定する。省略可能な EncryptionSpec または SignatureSpec オブジェクトを作成した場合、それらをそれぞれのメソッドのパラメータとして指定します。これらのオブジェクトを指定しない場合、SOAP メッセージ全体に対して暗号化またはデジタル署名が行われます。security.addToken(userToken);
security.addSignature(x509token, sigSpec);
security.addToken(x509token);
security.addEncryption(serverToken, encSpec);
weblogic.webservice.security.request 属性を使用してセキュリティ要素をセッションの属性として設定することで、セキュリティ要素を SOAP リクエストに追加する。context.getSession().setAttribute("weblogic.webservice.security.request",
security);
WebLogic Web サービス セキュリティ API を使用してセキュアな非 WebLogic Web サービスを呼び出すときには、次の点に注意してください。
addXXX() メソッドを使用して SOAP メッセージの <wsse:Security> 要素にトークンおよび暗号化と署名の情報を追加する場合、それらは指定した順序でメッセージに適用されます。ただし、最終的な SOAP メッセージでは逆の順序になります。addXXX() メソッドを使用して署名を追加した後にその署名の X.509 トークンを追加します。これは、実際の証明書と省略可能なプライベート キーを指定する X.509 トークンは、メッセージの受信側が署名を処理する前に読み取る必要があるからです。 <wsse:Security> 要素自体の内容に対して暗号化またはデジタル署名を行うことはできません。Web サービスの呼び出しでデジタル署名および暗号化を使用するクライアント アプリケーションを実行する場合、次のシステム プロパティを設定すると詳細な実行時セキュリティ情報を表示できます。
転送レベルのセキュリティとは、セキュア ソケット レイヤ (SSL) を使用したクライアント アプリケーションと Web サービスの間の接続の保護です。主な手順を次に示し、詳細についてはこの章の後の節で説明します。
一方向の SSL (デフォルト。WebLogic Server がクライアント アプリケーションに証明書を提示する必要がある)、または双方向の SSL (クライアント アプリケーションと WebLogic Server が両方とも互いに証明書を提示する必要がある) のいずれかをコンフィグレーションできます。
SSL の詳細、一方向と双方向の違い、およびコンフィグレーションの手順については、「SSL のコンフィグレーション」を参照してください。
「HTTPS プロトコルを指定する」を参照してください。
「クライアント アプリケーションに対して SSL をコンフィグレーションする」を参照してください。
警告 :WebLogic Web サービスを呼び出すときに双方向 SSL を使用して接続を保護する場合、WebLogic Server は、anonymous ID を使用して Web サービスへのアクセスを認可します。この認可が失敗した場合、WebLogic Server はまず、証明書の身元を断定して、その身元が有効な WebLogic Server ユーザにマップされていることを確認してから、そのユーザ ID を使用して Web サービスを呼び出します。これは、その Web サービスまたはステートレス EJB バックエンド コンポーネントで特別な特権が必要とされていない場合も同様です。
警告: anonymous ユーザ ID ではなく、クライアント証明書にマップされたユーザ資格を使用するには、Web Service への匿名アクセスを無効にする必要があります。
警告 : しかし、WebLogic Server は一方向 SSL では証明書の身元を断定しません (この場合クライアント アプリケーションはその証明書を送信しないため)。
Web サービスで SSL を使用する場合には、以下のスレッドセーフの問題に留意する必要があります。BEA 生成の JAX-RPC クライアント スタブは、デフォルトではスレッドセーフです。ただし、SSL を有効にすると、クライアント スタブはスレッドセーフではなくなります。Web サービスのクライアント アプリケーションでスレッドの問題が発生する可能性を最小限に押さえるために、以下のいずれかを行うことをお勧めします。
weblogic.webservice.core.rpc.StubImpl オブジェクトを使用する場合は、複数の WebLogic 実行スレッドの同時実行が EJB コンテナによって防止されます。そのためには、次のコード例のように、StubImpl を拡張するオブジェクトを格納するために EJB にインスタンス変数を作成します。private TraderServicePort trader_;
weblogic.webservice.core.rpc.StubImpl オブジェクトの新しいインスタンスを作成する。これはパフォーマンス (およびコーディング) に大きな影響があるので、最後の手段としてのみ使用してください。クライアント アプリケーションが EJB でない場合は、同期化を利用してスレッドの問題を処理することもできます。EJB の仕様に違反するので、クライアントが EJB の場合は同期化を利用できません。
クライアント アプリケーションの SSL は、以下のいずれかを使用してコンフィグレーションします。
双方向 SSL を使用する場合は、クライアント アプリケーションもその証明書を WebLogic Server に提示する必要があります。詳細については、「クライアント アプリケーションでの双方向 SSL のコンフィグレーション」を参照してください。
この節で説明した API の詳細については、Web サービスのセキュリティに関する Javadoc を参照してください。
スタンドアロンのクライアント アプリケーションを使用している場合、WebLogic Server は、webserviceclient+ssl.jar クライアント実行時 JAR ファイルで SSL の実装を提供します。このクライアント JAR ファイルには、SSL 実装のほか、webservicesclient.jar にある、標準のクライアント JAX-RPC 実行時クラスも入っています。
注意 :クライアント機能に関する BEA の現在のライセンスの詳細については、BEA eLicense Web サイトを参照してください。
クライアント アプリケーションに対して基本的な SSL サポートをコンフィグレーションするには、次の手順に従います。
weblogic.webservice.client.ssl.trustedcertfile System プロパティを、PEM エンコード済み証明書のコレクションを含むファイルの名前に設定する。BaseWLSSLAdapter.setTrustedCertificatesFile(String ca_filename) メソッドを実行する。WL_HOME/server/lib/webserviceclient+ssl.jar 実行時 Java クライアント JAR ファイルを CLASSPATH に追加する。WL_HOME は、WebLogic Platform の最上位ディレクトリです。このクライアント JAR ファイルには、SSL 実装および JAX-RPC のクライアント実行時実装が入っています。System プロパティを設定する。デフォルトでは、WebLogic SSL の実装を使用するクライアント アプリケーションはソケットを共有しません。この動作を変更する場合は、「WebLogic の SSL 実装使用時の SSL ソケット共有の使用」を参照してください。
詳細については、Web サービスのセキュリティに関する Javadoc を参照してください。
WebLogic Server が提供する SSL 実装を、weblogic.webservice.client.WLSSLAdapter アダプタ クラスを使用してプログラムでコンフィグレーションすることもできます。このアダプタ クラスには、WebLogic Server の SSL 実装固有のコンフィグレーション情報が保持されていて、コンフィグレーションの参照と変更を可能にします。
次の抜粋は、ある WebLogic Web サービスに対する WLSSLAdapter クラスのコンフィグレーションの例です。太字の行については、例の後で説明します。
// アダプタをインスタンス化する
WLSSLAdapter adapter = new WLSSLAdapter();adapter.setTrustedCertifcatesFile("mytrustedcerts.pem");
// optionally set the Adapter factory to use this
// instance always...
SSLAdapterFactory.getDefaultFactory().setDefaultAdapter(adapter);
SSLAdapterFactory.getDefaultFactory().setUseDefaultAdapter(true);
// サービス ファクトリを作成
ServiceFactory factory = ServiceFactory.newInstance();
// サービスを作成
Service service = factory.createService( serviceName );
// 呼び出しを作成
Call call = service.createCall();
call.setProperty("weblogic.webservice.client.ssladapter",
adapter);
try {
// リモートの Web サービスを呼び出し
String result = (String) call.invoke( new Object[]{ "BEAS" } );
System.out.println( "Result: " +result);
} catch (JAXRPCException jre) {
...
} }
この例では、まず、WebLogic Server が提供する WLSSLAdapter クラスをインスタンス化する方法を示しています。webserviceclient+ssl.jar ファイルにある SSL 実装をサポートするクラスです。次に、setTrustedCertificatesFile(String) メソッドを使用して認証局証明書が入ったファイルの名前を選択して、アダプタ インスタンスをコンフィグレーションしています。この例では、ファイルの名前は mytrustedcerts.pem です。
次に、アダプタ ファクトリのデフォルトのアダプタとして WLSSLAdapter を設定する方法を示し、ファクトリが必ずこのデフォルト値を返すようにコンフィグレーションしています。
注意 :これは省略可能な手順で、すべての Web サービスとそれぞれに対応するコンフィグレーションが、同じアダプタ クラスを共有できるようにします。
また、Web サービスの特定のポートや呼び出しに対してこのアダプタを設定することもできます。上の例では、このアダプタを設定し、Call クラスを使用して Web サービスを動的に呼び出す方法を示しています。
call.setProperty("weblogic.webservice.client.ssladapter", adapter);
weblogic.webservice.client.SSLAdapter インタフェース (この例では、WebLogic Server が提供する WLSSLAdapter クラス) を実装するオブジェクトにこのプロパティを設定してください。
次の例では、アダプタを設定し、Stub インタフェースを使用して Web サービスを静的に呼び出す方法を示しています。
((javax.xml.rpc.Stub)stubClass)._setProperty("weblogic.webservice.client.ssladapter", adapterInstance);
次のメソッドを使用することにより、Web サービスの呼び出しまたはポートの特定のインスタンスに対するアダプタを取得して、Web サービスを動的に呼び出せます。
call.getProperty("weblogic.webservice.client.ssladapter");
Web サービスを静的に呼び出すには、次のメソッドを使用します。
((javax.xml.rpc.Stub)stubClass)._getProperty("weblogic.webservice.client.ssladapter");
詳細については、Web サービスのセキュリティに関する Javadoc を参照してください。
デフォルトでは、WebLogic Server 提供の SSL 実装を使用して WebLogic Web サービスに接続する SSL クライアント アプリケーションでソケットの共有は無効です。
ただし、クライアント アプリケーションのパフォーマンスを向上させるために、ソケット共有を有効にして Web サービスの複数の連続的な呼び出しを実現することができます。このソケット共有メカニズムを使用すると、SSL 接続の再利用のパフォーマンスを向上させつつ、必要なセキュリティを実施することができます。
アプリケーションが、実際には複数のクライアントが SSL 認証を使用して Web サービスを呼び出すサーバである場合は、クライアントが別のクライアントの JAX-RPC スタブ実装オブジェクト (weblogic.webservice.core.rpc.StubImpl) にアクセスするのを防止する必要があります。
セキュリティおよび一般的なスレッドセーフの問題のため (「Web サービスでの SSL の使用が及ぼす影響」を参照)、ソケット共有メカニズムはデフォルトでは無効です。
システム プロパティを使用して、SSL クライアント アプリケーションでソケットの共有を有効にするには、次の例のように、クライアント アプリケーションの起動に使用するコマンドで Java のシステム プロパティ https.sharedsocket を true に設定します。
java -Dbea.home=/bea_home \
-Djava.protocol.handler.pkgs=com.certicom.net.ssl\
-Dhttps.sharedsocket=true my_app
https.sharedsocket システム プロパティのデフォルト値は false です。
共有ソケットのタイムアウト値を指定することもできます。そのためには、次の例のように、https.sharedsocket.timeout システム プロパティを使用して共有ソケットが存続する秒数を設定します。
java -Dbea.home=/bea_home \
-Djava.protocol.handler.pkgs=com.certicom.net.ssl\
-Dhttps.sharedsocket=true
-Dhttps.sharedsocket.timeout=30 my_app
https.sharedsocket.timeout のデフォルト値は 15 秒です。
注意 :このタイムアウト値は、ソケットを制御する実際の転送レイヤには適用されません。この値は、SSL ソケットが指定の期間に参照されていないかどうかを判断するために使用します。参照されていない場合、その参照について、時間切れになっていればソケットは閉じられ、プロトコル ハンドシェークが再開されます。
SSL クライアント アプリケーション内で、プログラムからソケットの共有を有効にする場合に、システム プロパティではなく weblogic.webservice.binding.https.HttpsBindingInfo SSL バインディング API を使用することもできます。WebLogic SSL 実装を使用する際には、HttpsBindingInfo のパブリック コンストラクタを使用して HttpsBindingInfo オブジェクトを作成します。コンストラクタは、クライアント アプリケーションが SSLAdapter クラスの WLSSSLAdapter サブクラスを使用していると指定しています。
API でクライアント アプリケーションのソケットの共有を有効にするには、HttpsBindingInfo.setSocketSharing(boolean) セッター メソッドに値 true を渡し、これを HttpsBindingInfo オブジェクトに対して使用します。ソケットの共有を無効化するには、メソッドに値 false を渡します。このメソッドをアプリケーション内に呼び出さなかった場合のデフォルト値は、false (ソケットの共有は行われない) です。
また、HttpsBindingInfo.setSharedSocketTimeout(long) メソッドに、共有されるソケットが有効である秒数を渡し、それを HttpsBindingInfo オブジェクトに対して使用することで、共有されるソケットのタイムアウト値を指定することもできます。このメソッドの設定を行わなかった場合のデフォルト値は、15 秒です。
注意 :このタイムアウト値は、ソケットを制御する実際の転送レイヤには適用されません。この値は、SSL ソケットが指定の期間に参照されていないかどうかを判断するために使用します。参照されていない場合、その参照について、時間切れになっていればソケットは閉じられ、プロトコル ハンドシェークが再開されます。
クライアント アプリケーション内で共有されている SSL ソケットを閉じるには、HttpsBindingInfo オブジェクトに対して HttpsBindingInfo.closeSharedSocket() メソッドを使用します。このメソッドにはパラメータがありません。通常、共有されるソケットは、HttpsBindingInfo オブジェクトを作成する元となったオブジェクトのクリーンアップ メソッドで閉じます。
サードパーティの SSL 実装を使用する場合は、まず独自のアダプタ クラスを実装する必要があります。次の例は、JSSE のサポートを提供する簡単なクラスを示しています。自分でクラスを実装する主な手順は、例の後で説明します。
import java.net.URL;
import java.net.Socket;
import java.net.URLConnection;
import java.io.IOException;
public class JSSEAdapter implements weblogic.webservice.client.SSLAdapter {
javax.net.SocketFactory factory =
javax.net.ssl.SSLSocketFactory.getDefault();
// weblogic.webservice.client.SSLAdapter インタフェースを実装
public Socket createSocket(String host, int port) throws IOException {
return factory.createSocket(host, port);
}
public URLConnection openConnection(URL url) throws IOException {
// java.protocol.handler.pkgs が正しく設定されていることを前提とする
return url.openConnection();
}
// コンフィグレーション インタフェース
public void setSocketFactory(javax.net.ssl.SSLSocketFactory factory) {
this.factory = factory;
}
public javax.net.ssl.SSLSocketFactory getSocketFactory() {
return (javax.net.ssl.SSLSocketFactory) factory;
}
}
weblogic.webservice.client.SSLAdapter
public Socket createSocket(String host, int port)
throws IOException
public URLConnection openConnection(URL url) throws IOException
このメソッドは、java.net.URLConnection を拡張するオブジェクトを返します。このオブジェクトは、指定された URL に接続されるようにコンフィグレーションされます。これらの接続は、Web サービスの WSDL のダウンロードなど、使用頻度の低いネットワーク オペレーションに使用されます。
weblogic.webservice.client.ssl.adapterclass
WLSSLAdapter を自分のクラスに置き換えて、アダプタに定義されたコンフィグレーション方法を使用します。詳細については、Web サービスのセキュリティに関する Javadoc を参照してください。
SSLAdapterFactory クラスを拡張することによって、カスタムの SSL アダプタのファクトリ クラス (アダプタのインスタンスを作成するために使用) を作成することができます。ファクトリ クラスを拡張する理由の 1 つとして、各アダプタの使用に先立ち、その作成時にカスタムのコンフィグレーションを実行できることが挙げられます。
カスタムの SSL アダプタのファクトリ クラスを作成するには、次の手順に従います。
weblogic.webservice.client.SSLAdapterFactory
public weblogic.webservice.client.SSLAdapter createSSLAdapter();
アダプタ ファクトリによって、SSLAdapter またはこのインタフェースを実装するアダプタが新たに作成されたときは、必ず、このメソッドが呼び出されます。このメソッドを書き換えることによって、新しいアダプタを実際に使用し始める前にカスタムのコンフィグレーションを実行できます。
SSLAdapterFactory.setDefaultFactory(factoryInstance);
詳細については、Web サービスのセキュリティに関する Javadoc を参照してください。
WebLogic Server で双方向 SSL をコンフィグレーションした場合は、一方向 SSL で必要なように WebLogic Server がクライアント アプリケーションに証明書を提示するだけでなく、クライアント アプリケーションも WebLogic Server に証明書を提示する必要があります。次のサンプル Java コードはその一方向を示しており、クライアント アプリケーションが引数としてクライアント証明書ファイルを受け取ります (関連コードは太字)。
...
SSLAdapterFactory factory = SSLAdapterFactory.getDefaultFactory();
WLSSLAdapter adapter = (WLSSLAdapter) factory.getSSLAdapter();
if (argv.length > 1 ) {
System.out.println("loading client certs from "+argv[1]);
FileInputStream clientCredentialFile = new FileInputStream (argv[1]);
String pwd = "clientkey";
adapter.loadLocalIdentity(clientCredentialFile, pwd.toCharArray());
javax.security.cert.X509Certificate[] certChain = adapter.getIdentity("RSA",0);
factory.setDefaultAdapter(adapter);
factory.setUseDefaultAdapter(true);
...
たとえば、クライアント アプリケーションがファイアウォールの内側で動作している状況で、プロキシ サーバを使用する必要がある場合は、以下の 2 つの System プロパティを使用してプロキシ サーバのホスト名とポートを設定します。
これらの System プロパティの詳細については、「Web サービスのシステム プロパティの使い方」を参照してください。
アクセス制御セキュリティとは、アクセスできるユーザを制御するために Web サービスをコンフィグレーションし、クライアントがオペレーションの 1 つを呼び出したときに Web サービスに HTTP を使用してそれ自体を認証するようにクライアント アプリケーションをコーディングすることです。
主な手順を次に示し、詳細についてはこの章の後の節で説明します。
「WebLogic Web サービスへのアクセスをコントロールする」を参照してください。
「HTTPS プロトコルを指定する」を参照してください。
「Web サービスに対して認証するためにクライアント アプリケーションをコーディングする」を参照してください。
WebLogic Web サービスは、標準 J2EE エンタープライズ アプリケーションとしてパッケージ化されます。したがって、Web サービスへのアクセスにセキュリティを設定するには、Web サービスを構成する以下のコンポーネントのいくつかまたはすべてに対するアクセスにセキュリティを設定する必要があります。
ベーシック HTTP 認証または SSL を使用して、WebLogic Web サービスにアクセスするクライアントを認証できます。上記のコンポーネントの多くは標準の J2EE コンポーネントであるため、標準の J2EE セキュリティ プロシージャを使用してセキュリティを設定します。以下の節では、これらの各コンポーネントを保護する方法について説明します。
注意 :Web サービスを実装するバックエンド コンポーネントが Java クラスまたは JMS リスナである場合、その Web サービスのセキュリティは、Web サービス全体または Web サービスを呼び出す URL にセキュリティ制約を追加することによってのみ設定できます。つまり、Web サービスを実装するバックエンド コンポーネントにはセキュリティを設定できません。
WebLogic のセキュリティのコンフィグレーション、プログラミング、および管理の詳細については、セキュリティに関するドキュメントを参照してください。
Web サービス全体のセキュリティは、Administration Console でセキュリティ ポリシーを作成して WebLogic Web サービスに割り当てることで設定します。また、Administration Console を使用して Web サービス オペレーションの一部にセキュリティを設定することもできます。セキュリティ ポリシーは、WebLogic リソース (このケースでは WebLogic Server またはそのオペレーションの一部) に「誰がアクセスできるのか」という質問に答えるものです。セキュリティ ポリシーは、WebLogic リソースとユーザ、グループ、またはロールの間の関連付けを定義するときに作成します。WebLogic リソースは、セキュリティ ポリシーが割り当てられるまでは保護されません。
セキュリティ ポリシーは、個々のリソースあるいはリソースの属性またはオペレーションに割り当てます。セキュリティ ポリシーをリソースのタイプに割り当てると、そのリソースのすべての新しいインスタンスがそのセキュリティ ポリシーを継承します。個々のリソースまたは属性に割り当てられたセキュリティ ポリシーは、リソースのタイプに割り当てられたセキュリティ ポリシーをオーバーライドします。
ユーザまたはグループを使用してセキュリティ ポリシーを作成する場合は、そのユーザまたはグループがデフォルト セキュリティ レルムでコンフィグレーションされた認証プロバイダで定義されている必要があります。ロールを使用してセキュリティ ポリシーを作成する場合は、そのロールがデフォルト セキュリティ レルムでコンフィグレーションされたロール マッピング プロバイダで定義されている必要があります。WebLogic 認証プロバイダおよびロール マッピング プロバイダは、デフォルトでコンフィグレーションされています。
Administration Console を使用して WebLogic Web サービスまたはそのオペレーションの一部を保護する手順については、『WebLogic リソースのセキュリティ』を参照してください。
「WebLogic Web サービスのホーム ページおよび WSDL の URL」で説明したとおり、クライアント アプリケーションは、URL を使用して Web サービスにアクセスします。 以下は、このような URL の例です。
http://ariel:7001/web_services/TraderService
URL へのアクセスを制限することにより、Web サービス全体へのアクセスを制限できます。そのためには、web.xml および weblogic.xml の両デプロイメント記述子ファイル (web-services.xml ファイルが格納されている Web アプリケーションにあります) をセキュリティ情報で更新します。
URL へのアクセス制限の詳細については、『WebLogic リソースのセキュリティ』を参照してください。
Web サービスを実装するステートレス セッション EJB に対してセキュリティを設定する場合は、そのサービスを呼び出すクライアント アプリケーションは、Web アプリケーション、WSDL および Web サービスのホーム ページにはアクセスできますが、オペレーションを実装するメソッドそのものを呼び出すことができない場合があります。このタイプのセキュリティは、EJB のビジネス ロジックに誰がアクセスしたかを細かくモニタするが、Web サービス全体へのアクセスはブロックしないという場合に便利です。
また、このタイプのセキュリティは、メソッドレベルで、Web サービスのさまざまなオペレーションにアクセスする場合にも使用できます。たとえば、情報を表示するメソッドは任意のユーザによって呼び出せるが、一部のユーザのみが情報を更新できるように指定することができます。
Administration Console を使用して EJB および個々の EJB メソッドを保護する手順については、『WebLogic リソースのセキュリティ』を参照してください。
次の手順に示すように、Web サービスを記述する web-services.xml デプロイメント記述子を更新することによって、WebLogic Web サービスの WSDL およびホーム ページへのアクセスを制限できます。
web-services.xml ファイルは、Web サービス EAR ファイルにある Web アプリケーションの WEB-INF ディレクトリにあります。ファイルの場所の詳細については、「Web サービス EAR ファイル パッケージ」を参照してください。
<web-service> 要素に exposeWSDL="False" 属性を追加します。ホーム ページへのアクセスを制限するには、exposeHomepage="False" 属性を追加します。次に例を示します。<web-service
name="stockquotes"
uri="/myStockQuoteService"
exposeWSDL="False"
exposeHomePage="False" >
...
</web-service>
Web サービスを HTTPS によってのみアクセスできるようにするには、次の例に示すように、その Web サービスを記述する web-services.xml ファイルにある <web-service> 要素の protocol 属性を更新します。
<web-services>
<web-service name="stockquotes"
targetNamespace="http://example.com"
uri="/myStockQuoteService"
protocol="https" >
...
</web-service>
</web-services>
注意 :WebLogic Server に対して SSL のコンフィグレーションは行うが、web-services.xml ファイルで HTTPS プロトコルを指定しない場合は、クライアント アプリケーションから HTTP および HTTPS を使用して Web サービスにアクセスすることができます。ただし、web-services.xml ファイルで HTTPS アクセスを指定した場合、クライアント アプリケーションでは HTTP を使用して Web サービスにアクセスできません。
servicegen Ant タスクを使用して Web サービスをアセンブルする場合は、次の build.xml ファイルのサンプルに示すように、<service> 要素の protocol 属性を使用して HTTPS プロトコルを指定してください。
<project name="buildWebservice" default="ear">
<target name="ear">
<servicegen
destEar="ws_basic_statelessSession.ear"
contextURI="WebServices"
<service
ejbJar="HelloWorldEJB.jar"
targetNamespace="http://www.bea.com/webservices/basic/statelesSession"
serviceName="HelloWorldEJB"
serviceURI="/HelloWorldEJB"
protocol="https"
generateTypes="True"
expandMethods="True">
</service>
</servicegen>
</target>
</project>
Web サービスを呼び出す JAX-RPC クライアント アプリケーションを記述する際、クライアントの認証ができるように、サービスにユーザ名とパスワードを送信するための次の 2 つのプロパティを使用します。
次の例は JAX-RPC 仕様からの抜粋ですが、javax.xml.rpc.Stub インタフェースを使用してセキュアな Web サービスを呼び出す場合の、これらのプロパティの使い方を示しています。
StockQuoteProviderStub sqp = // ... スタブを取得する
sqp._setProperty ("javax.xml.rpc.security.auth.username", "juliet");
sqp._setProperty ("javax.xml.rpc.security.auth.password", "mypassword");
float quote sqp.getLastTradePrice("BEAS");
WebLogic で生成したクライアント JAR ファイルを使用して Web サービスを呼び出す場合は、Stub クラスがすでに作成されているため、JAX-RPC 仕様から抜粋した次の例に示すように、getServicePort() メソッドのサービス固有の実装にユーザ名とパスワードを渡すことができます。
StockQuoteService sqs = // サービスへアクセスを取得する;
StockQuoteProvider sqp = sqs.getStockQuoteProviderPort ("juliet", "mypassword");
float quote = sqp.getLastTradePrice ("BEAS");
この例では、getStockQuoteProvidePort() メソッドの実装が、上記 2 つの認証プロパティを設定します。
JAX-RPC を使用してセキュアな Web サービスを呼び出すクライアント アプリケーションの記述に関する詳細については、http://java.sun.com/xml/jaxrpc/index.html を参照してください。
「WebLogic Web サービスのデプロイとテスト」では、非セキュアな WebLogic Web サービスをホーム ページから呼び出してテストする方法について説明しています。
セキュアな WebLogic Web サービスをホーム ページからテストする場合は、サーバ自体が Web サービスのセキュアなクライアントとして機能するため、WebLogic Server の追加のコンフィグレーションが必要です。特に、trusted-ca.pem という、信頼性のある認証局 (CA) ファイルを使用するように WebLogic Server をコンフィグレーションする必要があります。ホーム ページはセキュアな Web サービスを呼び出すときにこのファイルを使用するようにハードコード化されており、サーバ キーストアを使用しません。ホーム ページは標準の WebLogic Web サービス クライアント JAR ファイルを使用しており、標準の JAR ファイルには、可能な限りシン クライアントにする目的で、キーストアから証明書を抽出する際に必要なセキュリティ API が含まれていないためです。
注意 :ホーム ページからセキュアな Web サービスをテストするときには、双方向 SSL を使用できません。
ホーム ページからセキュアな WebLogic Web サービスをテストするには、次の手順に従います。
詳細については、「SSL のコンフィグレーション」を参照してください。
-Dweblogic.webservice.client.ssl.strictcertchecking=false
-Dweblogic.security.SSL.ignoreHostnameVerification=true
Windows NT では、ドメイン ディレクトリにある setEnv.cmd コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME\user_projects\domains\domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。
UNIX では、ドメイン ディレクトリにある setEnv.sh コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME/user_projects/domains/domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。
WL_HOME\server\lib\CertGenCA.der を、DER 形式から PEM 形式に変換するには、utils.der2pem WebLogic Server Java ユーティリティを使用します。java utils.der2pem CertGenCA.der
|
|
|