対称キーを使用したユーザー名認証の例
この例は、C# Web サービスクライアントを作成する方法を示しています。これは、そのリクエストに電子的に署名し、認証に使用される資格証明を埋め込みます。
この例のクライアントは、Windows Server 上で .NET 4.5 と Visual Studio 2013 を使用して作成されています。
1. クライアントおよびサーバーのトラストストアとキーストアのペアを生成する
サーバーとクライアントが電子的に署名された SOAP リクエストを使用して通信するには、クライアントとサーバーが証明書情報を交換して相互に信頼している必要があります。Windchill には、OpenSSL を使用して証明書、Java キーストア、およびトラストストアを生成するために使用できるユーティリティの例が用意されています。Windchill シェルを使用して、以下のスクリプトを呼び出します。
% cd<Windchill>/prog_examples/jws
% ant -f jws-stores.xml
このスクリプトを呼び出すと、証明書のエイリアス、件名、およびパスワードの値を入力するように要求されます。一般的に、デフォルト値をそのまま使用できます。このスクリプトの実行中に、これらの値のいずれかを変更すると、後で値の相違について説明する必要がある場合があります。
サーバーのキーストアのエイリアスはとりわけ重要です。上記のスクリプトによって提供されるデフォルト値は、wt.properties ファイルからの wt.rmi.server.hostname の値です。Web サーバーが実行されているホストの名前がこれでなければ、この値を変更できます。Java の観点からは、基本的な文字列の識別子をこのエイリアスに使用できますが、.NET では、これらのエイリアスが実際のホスト名を反映している (DNS によって解決できる) ほうが適切です。サーバーのホスト名を反映しないエイリアスを使用する場合は、クライアント側で追加のコンフィギュレーションを使用する必要があります。
このスクリプトの実行中に、デフォルト値をそのまま使用しない場合は、security.properties ファイルのコンテンツを確認して、スクリプトの実行中に提供される情報とそれが一致していることを確認します。このファイルは以下のロケーションにあります。
<Windchill>/bin/adminTools/WebServices/security.properties
このスクリプトの実行が完了したら、<Windchill>/prog_examples/jws/stores というディレクトリが作成されます。これには、"server.p12" というファイル (Personal Information Exchange ファイル) が、手順 3 で使用するサーバーのパブリックキーとともに含まれています。
jws-stores.xml Ant スクリプトにより、サーバーとクライアントの両方のトラストストアとキーストアのペアが生成されます。ただし、この例では、サーバーのパブリック証明書のみが必要です。
2. Web サービスを展開する
jws-stores.xml スクリプトを実行したら、Web サービスを作成して展開することができます。ここでは、Windchill に付属している簡単な Java Web サービスの例を使用します。これは、基本的な追加を実行します。この場合、対称キーを使用したユーザー名認証を使用して、サービスのセキュリティを確保する必要があります。詳細については、セキュリティ要件についてを参照してください。
以下のスクリプトを実行して、この Web サービスの例をコンパイルし、展開します。
% cd <Windchill>/prog_examples/jws/JavaService/src
% ant
スクリプトが完了したら、Windchill を再起動して、Web サービスの展開を終了します。Windchill が再起動したら、以下のような URL を使用して Web サービスの WSDL にアクセスできます。
http://<ホスト>/Windchill/servlet/ExampleJavaService?wsdl
3. サーバーのパブリックキーをクライアントの証明書ストアにインポートする
1. 手順 1 で作成した server.p12 ファイルをクライアントのマシンに転送します。
2. 「開始」 > 「ファイル名を指定して実行」を選択し、以下のコマンドを入力して、証明書マネージャを起動します。
C:\Windows\System32\certmgr.msc
3. 次に、server.p12 を Trusted People ストアにインポートします。
4. インポートウィザードが起動されたら、server.p12 ファイルのロケーションまで移動し、このファイルを選択して、証明書を生成するときに選択したパスワードを指定します。デフォルトのパスワードは changeit です。
4. Web サービスクライアントを作成する
1. Visual Studio を起動し、「ファイル」 > 「新規」 > 「プロジェクト」を選択して、プロジェクトを新規作成します。
2. 「新規プロジェクト」ウィンドウで、「テンプレート」表示枠から「コンソールアプリケーション」を選択します。
アプリケーションの名前を入力します (この例では WcClient)。
3. プロジェクトが作成されたら、ベースの .cs ファイルがエディタのメインウィンドウで開きます。「ソリューションエクスプローラ」表示枠で、「参照」フォルダを右クリックし、「サービス参照を追加」を選択します。
4. 「サービス参照を追加」ウィンドウで、「アドレス」フィールドにサービスの WSDL の URL を入力し、「Go」をクリックして WSDL ドキュメントを取得します。
5. 「名前空間」にネームスペースを入力し (この例では ExampleService)、「OK」をクリックします。
6. 「ソリューションエクスプローラ」表示枠で、もう一度「参照」フォルダを右クリックし、今度は「参照を追加」を選択します。
7. 開かれたウィンドウで、下へスクロールし、System.Net 参照を追加します。このプロセスを繰り返して System.Security 参照を追加します。
8. ここで、Web サービスにアクセスするためのクライアントのソースコードを作成する必要があります。以下に例を示します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography.X509Certificates;
namespace WcClient
{
class Program
{
static void Main(string[] args)
{
ExampleService.JavaServiceClient client = new ExampleService. JavaServiceClient();
client.ClientCredentials.UserName.UserName = "demo";
client.ClientCredentials.UserName.Password = "demo";
client.ClientCredentials.ServiceCertificate.SetDefaultCertificate(
StoreLocation.CurrentUser,
StoreName.TrustedPeople,
X509FindType.FindBySubjectName,
"host.company.com");
Console.WriteLine("1+2=" + client.add(1, 2));
}
}
}
9. X.509 証明書を取得するときに、件名をホスト名 (上記の例では “host.company.com”) と一致するように更新します。
10. 「ビルド」 > 「ソリューションのビルド」を選択するか、F6 キーを押して、クライアントを構築します。
11. Ctrl + F5 キーを押すか、「ビルド」 > 「デバッグ」 > 「デバッグなしで開始」を選択して、クライアントをテストします。
5. サーバーのホスト名を反映しない証明書のエイリアスを使用する
前述のとおり、.NET では、証明書のエイリアスが、サービスが常駐している実際のホスト名と一致しているほうが適切です。何らかの理由でこのエイリアスがサーバーのホスト名と一致しない場合に、クライアントを実行しようとすると、DNS 関連のエラーが発生します。この問題の次善策は、クライアントの app.config ファイルで DNS のエイリアスをサービス参照に追加することです。たとえば、証明書のエイリアスが ws-server である場合は、ws-server を Web サービスの終点のエイリアスにするように app.config を更新します。
<endpoint address="http://host.company.com/Windchill/servlet/ExampleJavaService"
binding="customBinding" bindingConfiguration="JavaServicePortBinding"
contract="ExampleService.JavaService" name="JavaServicePort">
<identity>
<dns value="ws-server" />
</identity>
</endpoint>
これは役に立ちましたか?