次の方法で共有


1 対 1 のクライアント証明書マッピングの構成

執筆者: Robert Lucero

背景

IIS 6 には、認証用の 1 対 1 の証明書を構成およびマッピングするためのユーザー インターフェイスがありました。 これにより、ユーザーは検証クライアント証明書を選択し、認証されたユーザーの資格情報を割り当てることができます。 IIS 7 以降には、同様の UI はありません。 このチュートリアルでは、管理パックの構成エディターを使用して 1 対 1 のクライアント証明書を構成するようにユーザーに指示するように設計されています。 このアドオンを持っていないユーザーは、AppCmd 引数と C# コード例の付録セクションを参照して、このチュートリアルを実行できます。

IIS 7 以降のスキーマ

これは、IIS 7 以降の IIS クライアント証明書マッピング認証機能のスキーマです。

<sectionSchema name="system.webServer/security/authentication/iisClientCertificateMappingAuthentication">
  <attribute name="enabled" type="bool" defaultValue="false" />
  <attribute name="oneToOneCertificateMappingsEnabled" type="bool" defaultValue="true" />
  <element name="oneToOneMappings">
    <collection addElement="add" clearElement="clear">
      <attribute name="enabled" type="bool" defaultValue="true" />
      <attribute name="userName" type="string" />
      <attribute name="password" type="string" encrypted="true" />
      <attribute name="certificate" type="string" required="true" isUniqueKey="true" />
    </collection>
  </element>
</sectionSchema>

前提条件

これらは、このチュートリアルに必要な前提条件です。 このチュートリアルでは、これらの作成方法や設定方法については説明しません。

  1. インストールされている IIS クライアント証明書マッピング モジュール
  2. HTTPS バインドが適切に構成された Web サイト
  3. Base-64 証明書 (.cer ファイル)。 [注: これは任意の有効な 64 ビット証明書でかまいませんが、ファイル形式である必要があります]
  4. クライアントにインストールされているクライアント証明書
  5. IIS 7 管理パック テクニカル プレビュー 2 のインストール

手順 1: 証明書 BLOB の取得

oneToOneMappings コレクション項目には、証明書と呼ばれる属性があります。 この属性に必要な値は証明書ではなく、実際の証明書 BLOB です。 その抽出方法を次に示します。

  1. .cer ファイルを右クリックします。

  2. コンテキスト メニューの [開く...] を選択する

  3. [その他のプログラム] の一覧から [メモ帳] を選択し、[OK] をクリックします。 [注: Vista/Windows 2008 リスト ビューでは、ドロップ ダウンの下にメモ帳が隠れている場合があります]

  4. メモ帳に表示される内容は次のとおりです。

    -----BEGIN CERTIFICATE----- 
    MIIEfjCCA2agAwIBAgIKFW1IXAAAAAAAAjANBgkqhkiG9w0BAQUFADAbMRkwFwYD 
    VQQDExBJSVNSZW1vdGVNZ3JUZXN0MB4XDTA4MDIxMTIxNTk1NloXDTA5MDIxMTIy 
    MDk1NlowaDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV 
    BAcTB1JlZG1vbmQxDTALBgNVBAoTBE1TRlQxDDAKBgNVBAsTA0lJUzEVMBMGA1UE 
    AxMMUkxVQ0VSTzItSUlTMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3611j 
    34q2qQgHa7ao11TcQMDYlJMrqET05MWFY1/Vso+leujLoIGTfdHOuz4IBVoeUE+y 
    mlL8r53s2BQeVFROnDtg4Jko1zJsz7AUAnQNBk/GYA1AHYmhY79Z0p1KXW/wSTJB 
    tdUn732GQOqYf4wY8jOD2zUJDUG4HXm6ib8ajwIDAQABo4IB+TCCAfUwDgYDVR0P 
    AQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMBMHgGCSqGSIb3DQEJDwRrMGkw 
    DgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJ 
    YIZIAWUDBAEtMAsGCWCGSAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYI 
    KoZIhvcNAwcwHQYDVR0OBBYEFHbHA+HwZcIrslklj1W3O23UFrBgMB8GA1UdIwQY 
    MBaAFMxzlGbmkp2+phhDg7TPfi83d7UVMHMGA1UdHwRsMGowaKBmoGSGL2h0dHA6 
    Ly9paXNzYjMwNS9DZXJ0RW5yb2xsL0lJU1JlbW90ZU1nclRlc3QuY3JshjFmaWxl 
    Oi8vXFxpaXNzYjMwNVxDZXJ0RW5yb2xsXElJU1JlbW90ZU1nclRlc3QuY3JsMIGe 
    BggrBgEFBQcBAQSBkTCBjjBEBggrBgEFBQcwAoY4aHR0cDovL2lpc3NiMzA1L0Nl 
    cnRFbnJvbGwvaWlzc2IzMDVfSUlTUmVtb3RlTWdyVGVzdC5jcnQwRgYIKwYBBQUH 
    MAKGOmZpbGU6Ly9cXGlpc3NiMzA1XENlcnRFbnJvbGxcaWlzc2IzMDVfSUlTUmVt 
    b3RlTWdyVGVzdC5jcnQwDQYJKoZIhvcNAQEFBQADggEBAEsSkcx0re36IL80UphJ 
    w/srR3LBsy8sfwqxBMzMTdF7k6jYtUVpn3D2Dd4JXXVOaEVud9YNn9pr6xJL4t79 
    Zh+hJzIPA5pQLbccx4vjWB4cWEYxzcoKYCuUdZrfPFXO1a5kQAj8IZ0/6bhMceyR 
    Z7dRDoaIuAGQLFAlC/KjIBCemDi54MlWtvATQ8bmiRuEOWeneK2Vd2e0fxyezk05 
    dRqa8DEC74CQN4rQuz395ECm+M/hQnN+dHOygV8n9swd0bdNq8qypwfVUes5HIpj 
    LFmKTuGyFSVj7jv+64oTxvxtYX2QFp9q6Bi+qj0uyrX8Xjxy5rPSVPEfnxPCBg58 
    RCI= 
    -----END CERTIFICATE-----
    
  5. "-----BEGIN CERTIFICATE-----" および "-----END CERTIFICATE-----" を削除する

  6. 証明書 BLOB を 1 行になるように書式設定します。

  7. このファイルを clientCertBlob.txt として保存する

手順 2: Web サイトの IIS クライアント証明書マッピング認証と 1 対 1 の証明書マッピングを有効にする

次の手順では、クライアント証明書マッピング認証機能である 1 対 1 の証明書マッピングを有効にし、マッピング エントリを追加する方法について説明します。

  1. IIS マネージャー UI の Inetmgr を起動する
  2. 構成中の SSL Web サイトを選択し、[構成エディター] を開く
  3. [セクション] ドロップダウン ボックスに「system.webServer/security/authentication/iisClientCertificateMappingAuthentication」と入力します。
  4. 有効なフィールドを選択し、値を true に変更する
  5. oneToOneCertificateMappingsEnabled プロパティ グリッド エントリを選択し、値を true に変更する
  6. oneToOneMappings プロパティ グリッドエントリを選択し、[アクション] 作業ウィンドウの [アイテムの編集...] をクリックする
  7. [コレクション エディター] タスク リストで [追加] をクリックする
  8. 上から単一文字列証明書 BLOB をコピーし、証明書フィールドに貼り付ける
  9. クライアントが認証される userNameパスワードを設定します。
  10. enabled フィールドを true に設定する
  11. [コレクション エディター] を閉じる
  12. [アクション] 作業ウィンドウで [適用] をクリックする [注: このプロセスのスクリプトを取得するには、[適用] をクリックする前に [スクリプトの生成] をクリックします]

これが完了すると、サーバーは、1 対 1 の証明書マッピング エントリで IIS クライアント証明書マッピング認証を処理するように構成されます。

手順 3: SSL を使用する Web サイトのクライアント証明書認証を有効にする

マッピングが作成され、機能が有効になると、クライアント証明書を使用するようにサイトを構成する必要があります。

  1. IIS マネージャー UI の Inetmgr 内から、クライアント証明書を使用する SSL Web サイトを選択します
  2. SSL UI モジュールを選択する
  3. [クライアント証明書]: [同意する] ラジオ ボタンを選択する
  4. [アクション] 作業ウィンドウで [適用] をクリックする

これで Web サイトは、クライアント証明書に基づいてクライアントを受け入れて認証するように構成されました。

手順 4: すべての動作の確認

SSL Web ページにアクセスしようとしているクライアントには、クライアント証明書が正しくインストールされている必要があります。 クライアントが証明書なしでページを要求しようとすると、401 が返されます。 クライアント証明書が正しくインストールされると、ページは通常どおりに提供されます。

ニーズに合わせて、さまざまな認可規則の組み合わせをお試しください。

まとめ

これで、IIS クライアント証明書マッピングと 1 対 1 の証明書マッピングが構成されました。

付録

これらは、チュートリアルの手順 2 と 3 を実行するためのコード スニペットです。 このコード スニペットはすべて、構成エディターのスクリプト生成を使用して生成されました。

AppCmd 固有の手順

appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/iisClientCertificateMappingAuthentication 
    /enabled:"True" /oneToOneCertificateMappingsEnabled:"True"  /commit:apphost

appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/iisClientCertificateMappingAuthentication 
    /+"oneToOneMappings.[userName='testUser',password='securePassWord!1',certificate='CERTIFICATE_BLOB']" /commit:apphost

appcmd.exe set config "Default Web Site" -section:system.webServer/security/access /sslFlags:"Ssl, SslNegotiateCert, Ssl128"  /commit:apphost

C# コード:

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample {

    private static void Main() {
        
        using(ServerManager serverManager = new ServerManager()) { 
            Configuration config = serverManager.GetApplicationHostConfiguration();
            
            ConfigurationSection iisClientCertificateMappingAuthenticationSection = 
                    config.GetSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "Default Web Site");
            iisClientCertificateMappingAuthenticationSection["enabled"] = true;
            iisClientCertificateMappingAuthenticationSection["oneToOneCertificateMappingsEnabled"] = true;
            
            ConfigurationElementCollection oneToOneMappingsCollection = 
                     iisClientCertificateMappingAuthenticationSection.GetCollection("oneToOneMappings");
            
            ConfigurationElement addElement = oneToOneMappingsCollection.CreateElement("add");
            addElement["userName"] = @"testUser";
            addElement["password"] = @"securePassWord!1";
            addElement["certificate"] = @"CERTIFICATE_BLOB";
            oneToOneMappingsCollection.Add(addElement);
            
            serverManager.CommitChanges();
        }
    }
}

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample {

    private static void Main() {
        
        using(ServerManager serverManager = new ServerManager()) { 
            Configuration config = serverManager.GetApplicationHostConfiguration();
            
            ConfigurationSection accessSection = config.GetSection("system.webServer/security/access", "Default Web Site");
            accessSection["sslFlags"] = @"Ssl, SslNegotiateCert, Ssl128";
            
            serverManager.CommitChanges();
        }
    }
}