IIS: 複数の Web サーバーで複数の証明書を管理する

多数のセキュリティ証明書を管理するのは厄介な作業ですが、Windows PowerShell を使用すると、この作業を迅速に行えるようになります。

Jason Helmick

大規模な Web 環境で証明書を管理するのは、かなり難しい作業です。何百もの SSL Web サイトをホストしている何百台ものサーバーがあり、それぞれ一意の証明書を使用している場合があります。この規模の環境で、IIS マネージャーの GUI を使用して、証明書をインストールして維持すると時間がかかります。

しかし、心配する必要はありません。GUI よりも良い方法があります。Web サーバーが 2 台の場合でも 200 台の場合でも、Windows PowerShell を使用すると、数日、数週間、数か月かかる作業を、ほんの数分で完了することができます。Web サイトの証明書や SSL を展開、インストール、および構成するプロセスを通じて、有効期限が近い証明書を特定して、そのような証明書を交換するいくつかの方法があります。

基本的な規則は単純です。この方法は IIS 7.5 と IIS 8 で使用できますが、Windows PowerShell リモート処理を有効にする必要があります。たとえば、一意のクラスター IP アドレスを持ち、負荷分散するように構成された Web サーバーが 2 台あるとします。各 Web サーバーでは、SSL の証明書とバインドが必要な 3 つの新しい Web サイトを実行しています。コードでは、クラスターの IP アドレスを内部アドレスに変更して、実際の Web サイトが特定できないようにしていますが、状況はおわかりいただけると思います。新しい証明書を購入し、.pfx ファイルを展開する準備しました。既存の Web サイトの内訳は次のとおりです。

  • Shop.Company.com – IP アドレス 192.168.3.201 – 証明書: shop.company.com.pfx
  • Update.Company.com – IP アドレス 192.168.3.202 – 証明書: update.company.com.pfx
  • Register.Company.com – IP アドレス 192.168.3.203 – 証明書: register.company.com.pfx

負荷分散構成の Web サーバーに証明書を展開してインストールする作業に着手しましょう。

展開とインストール

展開とインストールに着手するには、Web サーバーのコンピューター名が格納された変数と、各 Web サーバーへの Windows PowerShell リモート セッションが必要です。ここでは、コンピューター名は、ローカル コンピューターにあるテキスト ファイルから取得しましたが、Web サーバーがドメインのメンバーになっている場合は、Active Directory からコンピューター名を取得することもできます。

PS> $servers = Get-Content c:\webservers.txt PS> $session = New-PsSession –ComputerName $servers

証明書は、リモート サーバーにコピーして、簡単にインストールできるようにします。.pfx ファイルを盗まれることを心配する必要はありません。このセクションが完了する前に、コピーした証明書は削除します。このデモでは、.pfx ファイルは、クライアント コンピューターの c:\sites\certpfx にあります。

PS> $servers | foreach-Object{ copy-item -Path c:\sites\certpfx\*.* -Destination "\\$_\c$"}

CertUtil.exe は、Windows PowerShell リモート処理セッションで証明書をインストールするための優れたツールです。次の 1 行のコードを実行すると、各 Web サーバーに証明書がインストールされます。インストールが必要な証明書が 3 つ (Web サイトごとに 1 つ) あるため、コマンドを繰り返し実行していることに注意してください。

PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\shop.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\update.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\register.company.com.pfx}

CertUtil.exe を使用するときには、.pfx のパスワードを指定する必要があります。このコマンドはリアルタイムで実行しているので、パスワードも入力しましたが、スクリプトを作成する場合は、次のようなプロンプトからパスワードを取得する変数を使用して、パスワードと置き換えることをお勧めします。

PS> $Cred = (Get-Credential).password

証明書が盗まれないように、リモート Web サーバーから .pfx ファイルを削除することを忘れないでください。

PS> $servers | foreach-object {Remove-Item -Path "\\$_\c$\*.pfx"}

リモート サーバーに証明書をインストールしたら、次は Web サイトの HTTPS バインドを作成します。

Web サイトのバインドを作成する

負荷分散環境では、各サーバーの Web サイトごとに HTTPS バインドが必要になります。WebAdministration モジュールの New-WebBinding コマンドレットを使用すると、このプロセスが簡略化されます。このコマンドレットのパラメーターには、サイトの名前、プロトコル、ポート、およびクラスター IP アドレスを指定します。SslFlags パラメーターではバインドに使用する証明書の場所を指定します。

PS> Invoke-Command -session $session {Import-Module WebAdministration} PS> Invoke-command -Session $session { New-WebBinding -name shop -Protocol https -Port 443 -IPAddress 192.168.3.201 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name update -Protocol https -Port 443 -IPAddress 192.168.3.202 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name register -Protocol https -Port 443 -IPAddress 192.168.3.203 -SslFlags 0}

上記のコードでインストールした証明書は Windows の証明書記憶域にありましたが、次の選択肢があります。

  • 0 – Windows の証明書記憶域にある通常の証明書
  • 1 – Server Name Indication (SNI) 証明書
  • 2 – セントラル証明書ストア
  • 3 – セントラル証明書ストアにある SNI 証明書

よく見落としたり忘れがちな最後の手順は、新しい Web サイトのバインドに証明書をバインドすることです。

証明書をバインドする

最後の手順は混乱する可能性があります。GUI ベースの IIS マネージャーでは、このプロセスは表に出てきていませんが、Web サイトで SSL を使用するためには不可欠です。Web サイトのバインドに証明書をバインドする必要があります。

これは、2 つの手順から成るプロセスです。まず、各 Web サイトの証明書の拇印を取得して、適切な SSL バインドを作成できるようにします。ここでは、3 つの Web サイトがあるので、各サイトの証明書の拇印が必要です。これらの証明書を Web サイトにバインドするとき混乱しないように、それぞれの拇印を 3 つの異なる変数に格納することにします。

PS> Invoke-Command -session $session { $CertShop=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*shop*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertUpdate=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*update*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertRegister=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*register*"} | Select-Object -ExpandProperty Thumbprint}

次に、拇印を使用して証明書全体を取得し、証明書を各 Web サイトの SSL バインドとして割り当てます。次のコマンドでは、Get-Item コマンドレットを使用して証明書を取得し、New-Item コマンドレットを使用して SSL バインドを作成します。IIS プロバイダーである IIS:\SSLBindings では、バインド情報を伴う SSL バインドを作成します。

PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certShop" | new-item -path IIS:\SslBindings\192.168.3.201!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certUpdate" | new-item -path IIS:\SslBindings\192.168.3.202!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certRegister" | new-item -path IIS:\SslBindings\192.168.3.203!443}

通常、IIS バインドの情報は <IP アドレス>:<ポート><ホスト名> (*:80:*) という形式で表示されます。ただし、Windows PowerShell では、コロン (:) がパス表記として解釈されます。バインド情報の設定に Windows PowerShell を使用している場合は、: の代わりに感嘆符 (!) を使用します。

これでバインドは完了し、次のように HTTPS を使用して Web サイトにアクセスできるようになります。

PS> start iexplore https://shop.company.com PS> start iexplore https://update.company.com PS> start iexplore https://register.company.com

有効期限を確認する

ここまでに紹介した情報すべてを使用した便利なソリューションがもう 1 つあります。証明書の有効期限が近づいているか調べることは、多くの IT 管理者に共通のビジネス課題です。

証明書の管理には、有効期限が近づいている証明書を見つけて置き換える作業が含まれます。ここで紹介する概念と戦略を使用して、この問題に対処できます。必要なのは、1 行のコードを追加するだけです。ここでも証明書の有効期限が近づいているかどうかを確認する Web サーバーへの Windows PowerShell リモート処理セッションを開いている必要があります。

次の例では、LocalMachine 証明書ストアにあるすべての証明書をスキャンします。証明書の期限を表す notafter プロパティの値と ExpireInDays という名前のカスタム コラムの現在の日時を比較します。フィルター (Where-Object) では、証明書の期限が 90 日より短いかどうかを確認します。このコマンドでは、証明書の有効期限が近づいているサーバーと証明書の名前が一覧表示されます。

PS> Invoke-Command -Session $session { Get-ChildItem -Path Cert:\LocalMachine\My | Select-Object -Property PSComputerName, Subject, @{ n='ExpireInDays';e={($_.notafter - (Get-Date)).Days}} | Where-Object {$_.ExpireInDays -lt 90}}

この記事で紹介したことを活用すると、大規模な環境でも Windows PowerShell を使用して、有効期限が近づいている証明書をすべて正常かつ迅速に置き換えることができます。

Jason Helmick

Jason Helmick は、米国アリゾナ州フェニックスを拠点とする Interface Technical Training で Windows PowerShell テクノロジの責任者として働いています。彼は、講演者、執筆家、講師としても活躍しており、IIS 管理者としても働いています。

関連コンテンツ