1 対 1 のクライアント証明書マッピングの構成
背景 :
IIS 6 には、認証のために 1 対 1 の証明書を構成してマッピングするユーザー インターフェイスがありました。 このユーザー インターフェイスにより、ユーザーは検証クライアント証明書を選択して、認証されたユーザーの資格情報を割り当てることができました。IIS 7 にはこのような UI はありません。 このチュートリアルでは、ユーザーに Administration Pack の Configuration Editor を使用して 1 対 1 のクライアント証明書を構成する方法を説明します。 このアドオンが環境にないユーザーは、付録の AppCmd 引数と C# コード例に関するセクションを参照して、このチュートリアルを行うことができます。
※Windows Server 2008 R2では標準で構成エディターが含まれており、表示もすべて日本語になっています。
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 Administration Pack のインストール。
手順 1 : 証明書 Blob の入手
oneToOneMappings コレクション項目には、証明書 (certificate) と呼ばれる属性があります。 この属性の必須値は、証明書の値ではなく、実際の証明書 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 7 マネージャーを起動します。
- 構成する SSL Web サイトを選択して、Configuration Editor を開きます。
- [Section] ドロップダウン ボックスに「system.webServer/security/authentication/iisClientCertificateMappingAuthentication」と入力します。
- [enabled] フィールドを選択して、値を [true] に変更します。
- [oneToOneCertificateMappingsEnabled] プロパティ グリッド エントリを選択して、値を [true] に変更します。
- [oneToOneMappings] プロパティ グリッド エントリを選択して、[操作] ウィンドウの [Edit Items] をクリックします。
- [Collection Editor] の [Add] をクリックします。
- 上記から 1 つの文字列の証明書 Blob をコピーして、[certificate] フィールドに貼り付けます。
- クライアントが認証される [userName] と [password] を設定します。
- [enabled] フィールドを [True] に設定します。
- コレクション エディターを閉じます。
- [操作] ウィンドウの [適用] をクリックします。(注 : [適用] をクリックする前に [Generate Script] をクリックしてこのプロセスのスクリプトを入手してください。)
これが完了すると、サーバーは単一の 1 対 1 の証明書マッピング エントリで IIS クライアント証明書マッピング認証を処理するように構成されます。
手順 3 : SSL を使用した Web サイトに対するクライアント証明書認証の有効化
マッピングを作成し、機能を有効化したら、クライアント証明書を使用するようにサイトを構成する必要があります。
- IIS 7 マネージャー内から、クライアント証明書を使用する SSL Web サイトを選択します。
- UI モジュールの [SSL 設定] を選択します。
- [クライアント証明書] の下の [受理] ラジオ ボタンを選択します。
- [操作] ウィンドウの [適用] をクリックします。
これで Web サイトは、クライアント証明書に基づいてクライアントを受け入れて、認証するように構成されました。
手順 4 : すべての動作の確認
SSL Web ページにアクセスするクライアントには、クライアント証明書が適切にインストールされている必要があります。クライアントが証明書なしでページを要求しようとすると、401 エラーが生成されます。クライアント証明書が正しくインストールされると、ページは正常に機能します。
ニーズに合わせてさまざまな認証ルールの組み合わせを試してください。
まとめ :
ここでは、IIS クライアント証明書マッピングおよび単一の 1 対 1 証明書マッピングを構成しました。
付録 :
以下は、チュートリアルの手順 2 と 3 を行うためのコード スニペットです。これらはすべて Configuration Editor の Script Generation を使用して生成されました。
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();
}
}
}