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>
前提条件
これらは、このチュートリアルに必要な前提条件です。 このチュートリアルでは、これらの作成方法や設定方法については説明しません。
- インストールされている IIS クライアント証明書マッピング モジュール
- HTTPS バインドが適切に構成された Web サイト
- Base-64 証明書 (.cer ファイル)。 [注: これは任意の有効な 64 ビット証明書でかまいませんが、ファイル形式である必要があります]
- クライアントにインストールされているクライアント証明書
- IIS 7 管理パック テクニカル プレビュー 2 のインストール
手順 1: 証明書 BLOB の取得
oneToOneMappings コレクション項目には、証明書と呼ばれる属性があります。 この属性に必要な値は証明書ではなく、実際の証明書 BLOB です。 その抽出方法を次に示します。
.cer ファイルを右クリックします。
コンテキスト メニューの [開く...] を選択する
[その他のプログラム] の一覧から [メモ帳] を選択し、[OK] をクリックします。 [注: Vista/Windows 2008 リスト ビューでは、ドロップ ダウンの下にメモ帳が隠れている場合があります]
メモ帳に表示される内容は次のとおりです。
-----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-----
"-----BEGIN CERTIFICATE-----" および "-----END CERTIFICATE-----" を削除する
証明書 BLOB を 1 行になるように書式設定します。
このファイルを clientCertBlob.txt として保存する
手順 2: Web サイトの IIS クライアント証明書マッピング認証と 1 対 1 の証明書マッピングを有効にする
次の手順では、クライアント証明書マッピング認証機能である 1 対 1 の証明書マッピングを有効にし、マッピング エントリを追加する方法について説明します。
- IIS マネージャー UI の Inetmgr を起動する
- 構成中の SSL Web サイトを選択し、[構成エディター] を開く
- [セクション] ドロップダウン ボックスに「system.webServer/security/authentication/iisClientCertificateMappingAuthentication」と入力します。
- 有効なフィールドを選択し、値を true に変更する
- oneToOneCertificateMappingsEnabled プロパティ グリッド エントリを選択し、値を true に変更する
- oneToOneMappings プロパティ グリッドエントリを選択し、[アクション] 作業ウィンドウの [アイテムの編集...] をクリックする
- [コレクション エディター] タスク リストで [追加] をクリックする
- 上から単一文字列証明書 BLOB をコピーし、証明書フィールドに貼り付ける
- クライアントが認証される userName とパスワードを設定します。
- enabled フィールドを true に設定する
- [コレクション エディター] を閉じる
- [アクション] 作業ウィンドウで [適用] をクリックする [注: このプロセスのスクリプトを取得するには、[適用] をクリックする前に [スクリプトの生成] をクリックします]
これが完了すると、サーバーは、1 対 1 の証明書マッピング エントリで IIS クライアント証明書マッピング認証を処理するように構成されます。
手順 3: SSL を使用する Web サイトのクライアント証明書認証を有効にする
マッピングが作成され、機能が有効になると、クライアント証明書を使用するようにサイトを構成する必要があります。
- IIS マネージャー UI の Inetmgr 内から、クライアント証明書を使用する SSL Web サイトを選択します
- SSL UI モジュールを選択する
- [クライアント証明書]: [同意する] ラジオ ボタンを選択する
- [アクション] 作業ウィンドウで [適用] をクリックする
これで 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();
}
}
}