PowerShellでIIS証明書リクエストのマスタリング

IIS証明書リクエストの生成方法を学びたい場合、正しい場所に来ました。この記事では、PowerShellを使用して私がこれを行った方法と、IISウェブサイトに証明書をバインドする方法について説明します。

まず一つ言っておきますが、暗号化と証明書は大嫌いです。私のキャリアで何度か「証明書の人」となりましたが、それはシステム管理者にとってただの別の役割でした。

I never got to the point where I completely understood the technology and it seemed like every task I tried to accomplish around that area seemed to never work out. It’s definitely an unforgiving technology for sure.

PowerShellを使用してIISサーバーに証明書を自動的にインストールする方法についてお話しましょう。

ミッション

クライアントから新しいパブリックDigicert証明書をリクエストし、ワークグループで実行されているリモートWindows Server 2012 R2 Core ServerのIIS 8.5にインストールし、ウェブサイトにSSLバインディングを設定し、インストールされた証明書をバインディングに使用します。簡単ですよね?冗談です!

やり方

要するに、これを実現するためにはXステップが必要です。

  1. 証明書署名要求をIISで生成します。証明書をインストールするコンピューターで。私の場合、WinRMアクセスしかなかったので、リモートサーバーでInvoke-Commandを使用してcertreq.exeを実行し、CSRの内容をローカルファイルに送信しました。
  2. 公開CAによってCSRに署名してもらいます。(ここでは助けられない-私が作業したセキュリティからはきれいな証明書が戻ってきました)。私の場合、セキュリティチームからは、私が探していた証明書だけでなく中間証明書も含まれた.P7B形式の証明書のコレクションが.CERファイルにまとめられて返されました。これには少し手を加える必要がありました。
  3. 証明書署名要求を完了します。証明書をインストールするコンピューターで。これにより、証明書が証明書ストアに追加されます。
  4. サーバーにSSL IISウェブバインディングを作成します。
  5. 証明書をウェブバインディングにアタッチします。

IIS証明書要求の生成

最初のタスクは、リモートサーバー上でこのPowerShellスクリプトを使用してcertreq.exeを実行してリクエストファイルを収集することです。これには、certreq.exeがINFファイルを入力として必要とします。このファイルは、証明書が最終的に持つさまざまなオプションに使用されます。詳細には触れませんが、これは私が使用していたINFファイルのコピーです。

[Version]
Signature = "$Windows NT$"
[NewRequest]
Subject = "C=US,S=State,L=City,O=Company,OU=IT,CN=Name"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xa0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
Silent = True
SMIME = False
RequestType = PKCS10

New-CertificateSigningRequest関数では、これを簡単にカスタマイズできるようにしています。実際、私の関数を使用すると、CSR(リクエストファイル)を作成するために一時的にのみ必要なので、このファイルを見ることはありません。

次に、このINFファイルをリモートサーバーに取得し、certreq.exeを次のパラメーターで実行する必要があります。certreq.exe -new "$InfFilePath" "$reqFilePath"

これにより、リモートコンピュータ上でCSR(リクエストファイル)が生成されます。その後、このファイルをセキュリティチームに送信する必要があります。これにより、ローカルマシンコンテキストの証明書発行リクエストに、プライベートキーと公開キーの両方を含む証明書が作成されます。

Certificate service request in the Windows MMC snapin

IIS証明書リクエストの完了

私の場合、単一のCERファイルが返されました。私はこのPowerShell IISスクリプト内に関数を作成して、これを直接ローカルマシンコンテキストの個人ストアにインポートするだけでしたが、IISはそれを見ることができませんでした。その理由は、証明書にはプライベートキーも含まれている必要があるからです。単に証明書を個人ストアにインポートするだけでは動作しませんでした。証明書リクエストをcertreq.exeを使用して完了する必要がありました。

これを行うには、セキュリティチームから受け取った証明書をリモートサーバーにコピーし、次のようにcertreq.exeを実行します。certreq.exe -accept -machine "C:\issuedcert.cer"

常に応答証明書がローカルマシンコンテキストに入るようにするには、-machineパラメータを使用する必要があります。これにより、おそらく成功裏に完了するはずですが、私の場合は完全には機能しませんでした。何らかの理由で、私は次のようなエラーを受け取っていました:

Error requesting certificate

これは、リクエストファイルの公開キーがセキュリティチームによって返されたものと一致しなかったことを意味します。これをテストするには、単にcertutil.exe -dump requestfile.reqcertutil -dumpissuedcert.cerを実行します。出力をスクロールして、公開キーエリアを見つけてください。

Encrypted public key

これらの秘密鍵をコピーし、テキストエディタで比較して同じであることを確認してください。もし同じでなければ、セキュリティチームに連絡してリクエストの署名が正しくないことを伝えてください。

もし同じであれば、問題ありません。エラーは表示されないはずです。

SSLバインディングを作成します。

リモートサーバーで以下のコマンドを実行してください。

PS> Import-Module WebAdministration
PS> New-WebBinding -Name $WebsiteName -IP * -Port 443 -Protocol https

SSLバインディングに証明書を添付します。

リモートサーバーで以下のコマンドを実行してください。

PS> $certificate = Get-Item Cert:\localmachine\My\$Thumbprint
PS> $certificate | New-Item "IIS:\SSLBindings\0.0.0.0!443"

PowerShell IISスクリプトを取得します。

すべてがうまくいけば、完了です!もし少し助けが必要な場合は、3つの関数を作成して簡単に実行できるようにしました。Githubのリポジトリに移動して、関数を入手してください。

https://github.com/adbertram/Random-PowerShell-Work/tree/master/Certificates

https://github.com/adbertram/Random-PowerShell-Work/tree/master/IIS

コードの例

## この出力ファイルを証明書担当者に送信します 
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## 受け取った証明書をインポートします
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## バインディングを作成し、証明書を添付します。
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

関連リーディング

PowerShellを使用してIISを管理するためのATAブログ投稿をチェックしてください。

Source:
https://adamtheautomator.com/iis-certificate-request/