次の方法で共有


Web API での SSL の使用

一般的な認証スキームの中には、プレーン HTTP 経由でセキュリティで保護されていないものがあります。 特に、基本認証とフォーム認証では、暗号化されていない資格情報が送信されます。 安全性を確保するには、これらの認証方式で SSL を使用する必要があります。 さらに、SSL クライアント証明書を使用してクライアントを認証できます。

サーバーでの SSL の有効化

IIS 7 以降で SSL を設定するには:

  • 証明書を作成または取得します。 テスト用に、自己署名証明書を作成できます。
  • HTTPS バインドを追加します。

詳細については、「IIS 7で SSL を設定する方法」を参照してください。

ローカル テストでは、Visual Studio から IIS Express で SSL を有効にすることができます。 プロパティウィンドウで、SSL 有効化Trueに設定します。 SSL URLの値に注意してください。HTTPS 接続をテストするためにこの URL を使用します。

プロパティ で true が有効になっている S S L の イメージ

Web API コントローラーでの SSL の適用

HTTPS と HTTP バインディングの両方がある場合でも、クライアントは HTTP を使用してサイトにアクセスできます。 一部のリソースは HTTP 経由で使用できますが、他のリソースには SSL が必要な場合があります。 その場合は、アクション フィルターを使用して、保護されたリソースに SSL を要求します。 次のコードは、SSL をチェックする Web API 認証フィルターを示しています。

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "HTTPS Required"
            };
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }
}

SSL を必要とする Web API アクションにこのフィルターを追加します。

public class ValuesController : ApiController
{
    [RequireHttps]
    public HttpResponseMessage Get() { ... }
}

SSL クライアント証明書

SSL は、公開キー インフラストラクチャ証明書を使用して認証を提供します。 サーバーは、クライアントに対してサーバーを認証する証明書を提供する必要があります。 クライアントがサーバーに証明書を提供することはあまり一般的ではありませんが、これはクライアントを認証するための 1 つのオプションです。 SSL でクライアント証明書を使用するには、署名された証明書をユーザーに配布する方法が必要です。 多くのアプリケーションの種類では、これは優れたユーザー エクスペリエンスではありませんが、一部の環境 (エンタープライズなど) では実現可能な場合があります。

利点 欠点
- 証明書の資格情報は、ユーザー名/パスワードよりも強力です。 - SSL は、認証、メッセージの整合性、メッセージ暗号化を備えた完全なセキュリティで保護されたチャネルを提供します。 - PKI 証明書を取得して管理する必要があります。 - クライアント プラットフォームは SSL クライアント証明書をサポートする必要があります。

クライアント証明書を受け入れるように IIS を構成するには、IIS マネージャーを開き、次の手順を実行します。

  1. ツリー ビューでサイト ノードをクリックします。

  2. 中央のウィンドウで、SSL 設定 機能をダブルクリックします。

  3. クライアント証明書で、次のいずれかのオプションを選択します。

    • を受け入れる: IIS はクライアントから証明書を受け入れますが、証明書は必要ありません。
    • が必要: クライアント証明書が必要です。 (このオプションを有効にするには、[SSL が必要] も選択する必要があります)

ApplicationHost.config ファイルで次のオプションを設定することもできます。

<system.webServer>
    <security>
        <access sslFlags="Ssl, SslNegotiateCert" />
        <!-- To require a client cert: -->
        <!-- <access sslFlags="Ssl, SslRequireCert" /> -->
    </security>
</system.webServer>

SslNegotiateCert フラグは、IIS がクライアントから証明書を受け入れることを意味しますが、証明書は必要ありません (IIS マネージャーの "Accept" オプションと同等)。 証明書を要求するには、SslRequireCert フラグを設定します。 テスト用に、IIS Express、ローカル applicationhost でこれらのオプションを設定することもできます。"Documents\IISExpress\config" にある構成ファイル。

テスト用のクライアント証明書の作成

テスト目的で、MakeCert.exe を使用してクライアント証明書を作成できます。 まず、テストルート認証局を作成します。

makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer

Makecert によって、秘密キーのパスワードの入力を求められます。

次に、次のように、テスト サーバーの "信頼されたルート証明機関" ストアに証明書を追加します。

  1. MMC を開きます。
  2. ファイルから、 スナップインの追加と削除を選択します。
  3. の [使用可能なスナップイン] で、の [証明書] を選択し、[追加] をクリックします。
  4. 「コンピューター アカウント を選択します。」
  5. ローカルコンピュータを選択し、 ウィザードを完了します。
  6. ナビゲーション ウィンドウで、[信頼されたルート証明機関] ノードを展開します。
  7. [操作] メニューの [すべてのタスク ]をポイントし、[インポート] をクリックして証明書のインポート ウィザードを起動します。
  8. 証明書ファイル TempCA.cer を開きます。
  9. [開く] をクリックし、[ ] をクリックしてウィザードを完了します。 (パスワードを再入力するように求められます)。

次に、最初の証明書によって署名されたクライアント証明書を作成します。

makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name" 
     -eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk

Web API でのクライアント証明書の使用

サーバー側では、要求メッセージで GetClientCertificate 呼び出すことによって、クライアント証明書を取得できます。 クライアント証明書がない場合、このメソッドは null を返します。 それ以外の場合は、X509Certificate2 インスタンスが返されます。 このオブジェクトを使用して、発行者やサブジェクトなどの情報を証明書から取得します。 その後、この情報を認証や承認に使用できます。

X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;