ASP.NET Web アプリケーションで認証用のクライアント証明書を使用して Web サービスを呼び出す方法

文書翻訳 文書翻訳
文書番号: 901183 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

この資料では、認証のためにクライアント証明書を ASP.NET Web アプリケーションから Web サービスに渡す方法について説明します。

: この資料の手順は、Web サービスを呼び出さずに、HttpWebRequest クラスを使用して直接 HTTP 要求を行う場合にも適用されます。

はじめに

多くの場合、Web サービスでは、その Web サービスを呼び出すアプリケーションを認証する必要があります。Web サービスが承認を実行するには、その前に呼び出し元アプリケーションの認証を実行する必要があります。認証方法の 1 つとして、Web サービスを呼び出すアプリケーションにクライアント証明書の提示を要求する方法があります。

ASP.NET Web アプリケーションが、証明書の認証を使用する Web サービスを呼び出そうとすると、"アクセスが拒否されました" というエラー メッセージが表示されることがあります。コンソール アプリケーションや Microsoft Windows フォーム アプリケーションから同じ Web サービスを呼び出した場合は、エラー メッセージは表示されません。

この現象は、以下の 2 つの異なる証明書ストアをコンピュータが保持しているために発生します。
  • ローカル コンピュータ ストア : ASP.NET Web アプリケーションは、このストアを調べてクライアント証明書を見つけます。
  • ローカル ユーザー ストア : 対話型のユーザー アプリケーションは、このストアを調べてクライアント証明書を見つけます。
通常、対話型のユーザー アプリケーションがクライアント証明書をインストールすると、そのクライアント証明書はローカル ユーザー ストアにインストールされます。したがって、このクライアント証明書は対話型ユーザー アプリケーションに対しては機能しますが、ASP.NET Web アプリケーションに対しては機能しません。

詳細

ASP.NET Web でクライアント証明書を使用できるようにするには、ローカル コンピュータ ストアにクライアント証明書をインストールする必要があります。クライアント証明書をローカル コンピュータ ストアにインストールすると、Administrators グループ内のユーザー アカウントとクライアント証明書をインストールしたユーザーだけが、そのクライアント証明書を利用できます。このため、ASP.NET Web アプリケーションを実行するために使用されるユーザー アカウントに対して、クライアント証明書へのアクセス許可を与える必要があります。

: ローカル コンピュータ ストア内のクライアント証明書を使用するには、Microsoft .NET Framework 1.1 Service Pack 1 (SP1) がインストールされている必要があります。

また、ASP.NET Web アプリケーションが Web サービスを呼び出す場合、このアプリケーションでは、クライアント証明書を証明書ストアからエクスポートした後、そのクライアント証明書を Web サービス呼び出しに追加する必要があります。

クライアント証明書のインストールとユーザー アカウントへのアクセス許可の付与

クライアント証明書をインストールし、ASP.NET Web アプリケーションの実行に使用されるユーザー アカウントにクライアント証明書へのアクセス許可を付与するには、次の手順を実行します。

手順 1 : クライアント証明書をローカル コンピュータ ストアにインストールする

PKCS#12 (.pfx) ファイル形式のクライアント証明書の場合は、Microsoft Windows HTTP Services Certificate Configuration Tool (WinHttpCertCfg.exe) を使用することにより、クライアント証明書をインストールし、Network Service アカウントなどの追加ユーザー アカウントにクライアント証明書へのアクセス許可を付与できます。これを行うには、次の手順を実行します。
  1. Microsoft Windows HTTP Services Certificate Configuration Tool をダウンロードし、インストールします。このツールを入手するには、次のマイクロソフト Web サイトにアクセスしてください。
    http://www.microsoft.com/downloads/details.aspx?familyid=c42e27ac-3409-40e9-8667-c748e422833f
  2. コマンド プロンプトで以下のコマンドを実行します。
    WinHttpCertCfg.exe -i PfxFile -c LOCAL_MACHINE\MY -p Password
    : PfxFile には、.pfx ファイルの名前を入力します。Password には、.pfx ファイルのパスワードを入力します。パスワードが必要ないファイルの場合は、-p パラメータを省略します。

    通常、WinHttpCertCfg.exe ファイルは次のフォルダにあります。
    C:\Program Files\Windows Resource Kits\Tools
.pfx ファイルにアクセスできない場合で、Microsoft Windows Server 2003 または Microsoft Windows 2000 Server を実行しているコンピュータに Microsoft 証明書サービスをインストールしている場合は、クライアント証明書を要求して直接ローカル コンピュータ ストアにインストールできます。これを行うには、次の手順を実行します。
  1. 管理者の資格情報を持つユーザー アカウントを使用して、クライアント コンピュータにログオンします。
  2. Microsoft Internet Explorer で、証明機関 (CA) の Web サイトにアクセスします。たとえば、CA サーバーが CAServer という名前の場合、次の Web サイトにアクセスします。
    http://CAServer/certsrv
  3. [タスクの選択] の [証明書を要求する] をクリックし、[証明書の要求の詳細設定] をクリックします。
  4. [この CA への要求を作成し送信する] をクリックします。
  5. [証明書の要求の詳細設定] フォームで、名前と電子メール アドレスを入力します。
  6. [必要な証明書の種類] の下で、[クライアント認証証明書] をクリックします。
  7. [キーのオプション] の下で、[ローカル コンピュータの証明書ストアに証明書を格納する] チェック ボックスをオンにし、[送信] をクリックします。

    クライアント証明書の要求 ID を書き留めます。
  8. [潜在するスクリプト違反] ダイアログ ボックスで [はい] をクリックします。
  9. CA からクライアント証明書が発行された後、[保留中の証明書の要求の状態] をクリックします。
  10. [表示する証明書の要求を選択してください] で、手順 7. で送信した証明書要求をクリックします。
  11. [この証明書のインストール] をクリックし、[潜在するスクリプト違反] ダイアログ ボックスで [はい] をクリックします。

手順 2 : クライアント証明書へのアクセス許可を構成する

この手順では、ローカル コンピュータ ストアに保存されているクライアント証明書にアクセスするためのアクセス許可を ASP.NET アカウントに付与する必要があります。Windows Server 2003 では、Network Service アカウントが Web アプリケーションを実行するためのデフォルト アカウントです。したがって、Network Service アカウントに証明書へのアクセス許可を付与する必要があります。ASP.NET を実行するためのカスタム アカウントを構成している場合は、そのカスタム アカウントにアクセス許可を付与する必要があります。

: Microsoft インターネット インフォメーション サービス (IIS) 5.0 では、ASP.NET は、Network Service アカウントではなく ASPNET アカウントで実行されます。したがって、IIS 5.0 を実行しているコンピュータでは、ASPNET アカウントに対してアクセス許可を付与する必要があります。

特定のユーザー アカウントにアクセス許可を付与するには、コマンド プロンプトで次のコマンドを実行します。
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "IssuedToName" -a "AccountName"
: AccountName には、ローカル コンピュータ アカウントまたはドメイン アカウントの名前を入力します。IssuedToName には、クライアント証明書の発行先の会社またはドメインの名前を入力します。このコマンドには、大文字小文字を区別する検索文字列が含まれています。この検索文字列により、その文字列がサブジェクト名に含まれる証明書のうち、最初に列挙される証明書が検索されます。

次のコマンド ラインのコマンドは、Microsoft インターネット インフォメーション サービス (IIS) 6.0 で、クライアント証明書へのアクセス許可を Network Service アカウントに付与する方法の例です。
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "IssuedToName" -a "NetworkService"
次のコマンド ラインのコマンドは、IIS 5.0 で、クライアント証明書へのアクセス許可を ASPNET に付与する方法の例です。
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "IssuedToName" -a "ASPNET"
: Windows HTTP Services Certificate Configuration Tool を使用すると、クライアント証明書のインポートの処理と、クライアント証明書に対するアクセス許可の構成の処理を 1 つの手順に結合できます。たとえば、次のコマンド ラインのコマンドを使用すると、両方の処理が実行されます。
Winhttpcertcfg.exe -i PFXFile -c LOCAL_MACHINE\My -a "AccountName"

手順 3 : クライアント証明書をローカル ユーザー ストアからローカル コンピュータ ストアにコピーする

Windows フォーム アプリケーションやコマンド ライン アプリケーションなどの対話型のアプリケーションからクライアント証明書にアクセスできる場合、クライアント証明書は既にローカル ユーザー ストアに保存されています。しかし、ASP.NET Web アプリケーションなどのサービス アプリケーションが同じクライアント証明書にアクセスできない場合、クライアント証明書がローカル コンピュータ ストアに保存されていない可能性があります。

この手順では、証明書のエクスポート ウィザードを使用して、ローカル ユーザー ストア内のクライアント証明書をローカル コンピュータ ストアにコピーする方法を説明します。

: クライアント証明書が既にローカル コンピュータ ストアにある場合、または「手順 1 : クライアント証明書をローカル コンピュータ ストアにインストールする」のようにクライアント証明書を直接ローカル コンピュータ ストアにインストールできる場合は、「手順 4 : CA のルート証明書をインストールする」に進みます。ただし、「手順 3 : クライアント証明書をローカル ユーザー ストアからローカル コンピュータ ストアにコピーする」を使用する場合は、「手順 2 : クライアント証明書へのアクセス許可を構成する」に戻って、クライアント証明書へのアクセス許可を付与する必要があります。

クライアント証明書をローカル コンピュータ ストアにコピーするには、次の手順を実行します。
  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。mmc と入力し、[OK] をクリックします。
  2. [ファイル] メニューの [スナップインの追加と削除] をクリックし、[追加] をクリックします。
  3. [スタンドアロン スナップインの追加] ダイアログ ボックスで、[証明書] をクリックし、[追加] をクリックします。[コンピュータ アカウント] をクリックし、[次へ] をクリックし、[完了] をクリックします。
  4. [スタンドアロン スナップインの追加] ダイアログ ボックスで、[証明書] をクリックし、[追加] をクリックします。[ユーザー アカウント] をクリックし、[完了] をクリックします。
  5. [閉じる] をクリックし、[OK] をクリックします
  6. クライアント証明書をローカル ユーザー ストアからエクスポートするには、次の手順を実行します。
    1. [証明書 - 現在のユーザー] を展開し、[個人] を展開して、[証明書] をクリックします。
    2. クライアント証明書を右クリックし、[すべてのタスク] をクリックし、[エクスポート] をクリックして、[次へ] をクリックします。
    3. [はい、秘密キーをエクスポートします] オプションが利用できない場合、ASP.NET Web アプリケーションはそのクライアント証明書を使用できません。別のクライアント証明書を入手する必要があります。これを行うには、「手順 1 : クライアント証明書をローカル コンピュータ ストアにインストールする」と「手順 2 : クライアント証明書へのアクセス許可を構成する」の操作を実行します。それ以外の場合は、[はい、秘密キーをエクスポートします] をクリックし、[次へ] を 2 回クリックします。
    4. [パスワード] ボックスと [パスワードの確認入力] ボックスにパスワードを入力し、[次へ] をクリックします。
    5. [ファイル名] ボックスにファイル名を入力します。[次へ] をクリックし、[完了] をクリックします。
    6. [証明書のエクスポート ウィザード] ダイアログ ボックスで [OK] をクリックします。
  7. クライアント証明書をローカル コンピュータ ストアにインポートするには、次の手順を実行します。
    1. [証明書 (ローカル コンピュータ)] を展開し、[個人] を展開します。
    2. [証明書] を右クリックし、[すべてのタスク] をクリックし、[インポート] をクリックして、[次へ] をクリックします。
    3. [ファイル名] ボックスに、手順 6e. で指定したファイル名を入力し、[次へ] をクリックします。
    4. [パスワード] ボックスに、手順 6d. で指定したパスワードを入力し、[次へ] を 2 回クリックします。
    5. [完了] をクリックし、[OK] をクリックします。

手順 4 : CA のルート証明書をインストールする

クライアント証明書が既に VeriSign など外部の CA によって署名されている場合、または CA のルート証明書を既にインストールしている場合は、「手順 4 : CA のルート証明書をインストールする」は省略できます。

Windows には、デフォルトで多くの外部 CA のルート証明書が、信頼されたルート証明機関ストアに事前にインストールされています。
ルート証明書がインストールされていることを確認する
CA のルート証明書がインストールされていることを確認するには、次の手順を実行します。
  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。mmc と入力し、[OK] をクリックします。
  2. [ファイル] メニューの [スナップインの追加と削除] をクリックし、[追加] をクリックします。
  3. [スタンドアロン スナップインの追加] ダイアログ ボックスで、[証明書] をクリックし、[追加] をクリックします。[コンピュータ アカウント] をクリックし、[次へ] をクリックし、[完了] をクリックします。
  4. [閉じる] をクリックし、[OK] をクリックします
  5. [証明書 (ローカル コンピュータ)] を展開し、[信頼されたルート証明機関] を展開して、[証明書] をクリックします。
  6. 右側のウィンドウで、使用する CA のルート証明書が一覧に表示されていることを確認します。
ルート証明書をインストールする
使用する CA のルート証明書が一覧にない場合は、そのルート証明書をインストールする必要があります。使用する CA のルート証明書が、.cer ファイル、.der ファイル、.pfx ファイルなどの証明書ファイルとして発行されている場合は、次の手順を実行します。
  1. [証明書 (ローカル コンピュータ)] を展開し、[信頼されたルート証明機関] を右クリックします。[すべてのタスク] をクリックし、[インポート] をクリックします。
  2. [証明書のインポート ウィザード] ダイアログ ボックスで、[次へ] をクリックします。次に、[ファイル名] ボックスに証明書ファイルの名前を入力し、[次へ] を 2 回クリックします。
  3. [完了] をクリックし、[OK] をクリックします。
ルート証明書を要求する
使用する CA が Microsoft 証明書サービスのインストール データベースに含まれている場合は、ルート証明書を要求できます。これを行うには、次の手順を実行します。
  1. Microsoft Internet Explorer で CA の Web サイトにアクセスします。たとえば、CA サーバーが CAServer という名前の場合、次の Web サイトにアクセスします。
    http://CAServer/certsrv
  2. [CA 証明書、証明書チェーン、または CRL のダウンロード] をクリックし、[CA 証明書のダウンロード] をクリックします。
  3. [ファイルのダウンロード] ダイアログ ボックスの [保存] をクリックします。
  4. [名前を付けて保存] ダイアログ ボックスで、証明書ファイルを保存する場所を入力し、[保存] をクリックします。
  5. ルート証明書ファイルを保存したら、「ルート証明書をインストールする」の手順を使用して、信頼されたルート証明機関のストアに証明書ファイルをインストールします。

Web サービスを呼び出す

ローカル コンピュータ ストアまたはローカル ユーザー ストアのいずれかにクライアント証明書をインストールしたら、ASP.NET Web アプリケーションからクライアント証明書にアクセスして、Web サービスを呼び出すことができます。クライアント証明書にアクセスする手順は、Windows フォーム アプリケーションや ASP.NET Web アプリケーションの場合と同じです。

.NET Framework 1.1 を使用している場合は、最初に、キーを DER エンコードされたファイルにエクスポートする必要があります。System.Security.Cryptography.X509Certificates.X509Certificate クラスには、証明書ストアから証明書の詳細情報に直接アクセスするメソッドが含まれていないため、キーをエクスポートする必要があります。したがって、アプリケーションは証明書の詳細情報を DER エンコードされたファイルから読み込む必要があります。

: Web Services Enhancements 2.0 for Microsoft .NET (WSE) には、アプリケーションが証明書の詳細情報を証明書ストアから直接取得する手段が用意されています。

次の C# のコード例では、認証用のクライアント証明書を渡すことで Web サービスを呼び出す方法を示します。
using System.Security.Cryptography.X509Certificates;
...

  public void CallWebService()
  {
    // TODO: Replace <C:\WSClientCert.cer> with the path of your certificate file.
    string certPath = @"<C:\WSClientCert.cer>";

    // Create an instance of the Web service proxy.
    WebSvc.math mathservice = new WebSvc.math();
    // TODO: Replace <https://wsserver/securemath/math.asmx> with a valid URL.
    mathservice.Url = @"<https://wsserver/securemath/math.asmx>";

    // Create an X509Certificate object from the information 
    // in the certificate export file, and then add the certificate to the 
    // ClientCertificates collection of the Web service proxy.
    mathservice.ClientCertificates.Add(
        X509Certificate.CreateFromCertFile(certPath));

    long lngResult = 0;
    try
    {
      lngResult = mathservice.Add(Int32.Parse(operand1.Text), 
          Int32.Parse(operand2.Text));
      string result = lngResult.ToString();
    }
    catch(Exception ex)
    {
      if(ex is WebException)
      {
        WebException we = ex as WebException;
        WebResponse webResponse = we.Response;
        throw new Exception("Exception calling method. " + ex.Message);
      }
    }
  }

Web Services Enhancements 2.0 for Microsoft .NET

Web Services Enhancements 2.0 for Microsoft .NET (WSE) は、最新の Web サービス プロトコルを使用して Web サービスを構築するための Microsoft .NET クラス ライブラリです。プロトコルには、次のようなものがあります。
  • WS-Security
  • WS-SecureConversation
  • WS-Trust
  • WS-Policy
  • WS-SecurityPolicy
  • WS-Addressing
  • WS-Attachments
: WSE は、.NET Framework の一部としては含まれていません。WSE を入手するには、次のマイクロソフト Web サイトにアクセスしてください。
http://www.microsoft.com/downloads/details.aspx?FamilyId=FC5F06C5-821F-41D3-A4FE-6C7B56423841
クライアント証明書の認証を必要とする Web サービスにアクセスするために、これらのプロトコルのいずれかを使用する必要はありません。ただし、Microsoft.Web.Services2.Security.X509 クラスを使用することもできます。Microsoft.Web.Services2.Security.X509 クラスには、証明書ストア内のクライアント証明書に直接アクセスするためのメソッドが含まれています。これらのメソッドを使用する場合は、証明書をファイルにエクスポートする必要はありません。

次の C# のコード例では、ローカル コンピュータ ストアで SecureMathClient という名前の最初の証明書を検索する方法を示します。その後、このコード例では、その証明書を使用して、math Web サービスの Add を呼び出します。math Web サービスは、クライアント証明書を要求します。
...
  // TODO: Replace <SecureMathClient> with the name of the client certificate.
  string certName = "<SecureMathClient>";

  // WSE 2.0 method
  X509CertificateStore store =
    X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
  store.OpenRead();
  // Look for the first certificate that is named SecureMathClient.
  // Look in the local machine store.
  X509CertificateCollection col= 
    (X509CertificateCollection)store.FindCertificateBySubjectString(certName);
  X509Certificate cert =null;
  try
  { 

// This sample obtains the first matching certificate from the collection.
    cert = col[0];
  } 
  catch(Exception ex)
  {
    throw new Exception("Certificate not Found!");
  }

  // Create an instance of the Web service proxy.
  math mathservice = new math();
  // TODO: Replace <https://wsserver/securemath/math.asmx> with a valid URL.
  mathservice.Url = @"<https://wsserver/securemath/math.asmx>";
  mathservice.ClientCertificates.Add(cert);

  long lngResult = 0;
  try
  {
    lngResult = mathservice.Add(Int32.Parse(operand1.Text), 
        Int32.Parse(operand2.Text));
    result.Text = lngResult.ToString();
  }
  catch(Exception ex)
  {
    if(ex is WebException)
    {
      WebException we = ex as WebException;
      WebResponse webResponse = we.Response;
      throw new Exception("Exception calling method. " + ex.Message);
    }
  }

関連情報

System.Security.Cryptography.X509Certificates.X509Certificate クラスの関連情報については、以下の MSDN (Microsoft Developer Network) Web サイトを参照してください。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfSystemSecurityCryptographyX509CertificatesX509CertificateClassTopic.asp
ASP.NET Web アプリケーションを使用して、セキュリティの強化された Web サイトを呼び出す方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
817854 [FIX] ASP.NET Web アプリケーションで、クライアント証明書をセキュリティで保護された Web サイトに送信できない

プロパティ

文書番号: 901183 - 最終更新日: 2007年12月4日 - リビジョン: 2.2
この資料は以下の製品について記述したものです。
  • Microsoft .NET Framework 1.1?を以下の環境でお使いの場合
    • Microsoft Internet Information Services 6.0
    • Microsoft Internet Information Services 5.0
キーワード:?
kbhowto kbinfo kbwebservices kbcode kbcertservices KB901183
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com