概要
- Windows(PowerShell)で自己署名クライアント証明書を作成し、IISで認証できるようにする手順を説明します。
- 使用する環境は次の通りです。
OS Windows 10(64ビット) IDE Microsoft Visual Studio Community 2019(16.8.5) + C#(8.0) - 証明書ファイルの拡張子の違いについては、次の記事をご覧ください。
- 複数のクライアント証明書を使用するシナリオでは、自己署名ルート証明書で署名したクライアント証明書を使う方式の方が運用が楽になります。自己署名ルート証明書のみを「信頼されたルート証明書」ストアに格納するだけで良いため。詳細は次の記事をご覧ください。
クライアント証明書の作成
PowerShellを使って自己署名クライアント証明書を作成し、後の手順でクライアント証明書をインポートできるようCER形式でエクスポートします。
- 実行ユーザの権限でPowerShellを起動し、次を実行します。12345678910$client= New-SelfSignedCertificate <code>-Subject "CN=myexample, E=myexample@example.com"-NotAfter $(Get-Date).AddDays(3650) <code>-CertStoreLocation cert:\CurrentUser\My-TextExtension @( <code>"2.5.29.37={text}1.3.6.1.5.5.7.3.2","2.5.29.17={text}upn=myexample@example.com" <code>)Export-Certificate -Cert $client -FilePath myexample.cer
- サブジェクト(-Subject)にユーザを識別するための情報(ユーザ名やメールアドレス等)を指定します。メールアドレスのみであれば、”-Subject test@example.com”のような指定も可能です。
- 有効期限(-NotAfter)は10年としています
- クライアント証明書認証時、「現在のユーザ」の「個人」ストアに登録されたクライアント証明書が使用されるため、保存先(-CertStoreLocation)としてこのストアを指定しています。
- 証明書の拡張情報(-TextExtension)として次を設定しています。
- 「拡張キー使用法」(Enhanced Key Usage: 2.5.29.37)として「クライアント認証 (1.3.6.1.5.5.7.3.2)」を指定しています。
- サブジェクト代替名(2.5.29.17)としてUPNを指定しています。
- 拡張キー使用法やサブジェクト代替名で指定できるOIDは、New-SelfSignedCertificateのリファレンスの”-TextExtension”オプションの説明をご覧ください。
- コマンドのリファレンス
IISの設定変更
自己署名クライアント証明書を使った認証を行えるようIISの設定を行います。
これだけだと自己署名クライアント証明書の検証に失敗するので、信頼されたルート証明書に自己署名クライアント証明書を追加します。- IISの構成ファイルを変更します。
“(ソリューション名)\.vs\(プロジェクト名)\config”フォルダのapplicationhost.configを開き、sslFlags属性を修正します。必要であれば編集前にバックアップファイルを作成してください。123456789...<configuration>...<system.webServer>..<security><!-- <access sslFlags="None" /> --><access sslFlags="SslNegotiateCert" />...- この例では、クライアント証明書の提出を任意にするためのSslNegotiateCertを指定しています。
- sslFlagsで指定可能な値はリファレンスをご覧ください。
- 信頼されたルート証明機関にクライアント証明書を追加します。
- 自己署名クライアント証明書は、信頼されたルート証明書で署名されていないので、IISによるクライアント証明書の検証でエラーになってしまいます。
HTTP Error 403.16 - Forbiddenクライアント証明書が信頼されていないか、または無効である可能性があります。
- この問題を回避するために、管理者権限のPowerShellで次を実行します。
(IISはローカルコンピュータの「信頼されたルート証明機関」を参照しているため、管理者権限のPowerShellを使用します。)12Import-Certificate-FilePath myexample.cer -CertStoreLocation Cert:\LocalMachine\Root
- 自己署名クライアント証明書は、信頼されたルート証明書で署名されていないので、IISによるクライアント証明書の検証でエラーになってしまいます。
動作確認
Visual StudioにてWebアプリをデバッグ実行します。
起動されたブラウザの画面でクライアント証明書を選択する画面が表示されます。
なお、別のブラウザウインドウが存在していると、過去に選択されたクライアント証明書の情報が残ってしまい、クライアント証明書の選択画面が表示されない場合があります。そのため、動作確認で使用するブラウザはプライベートで起動することをお薦めします。