こんにちは、tomです。
前回に続き、SSL自動化方法を紹介しますが、今回はPosh-ACMEを利用したWindows Server編です。
https://www.netassist.ne.jp/sakuracloud-labo/archives/711
Posh-ACMEとは
PowerShellでACMEプロトコルを扱えるモジュールであり、無料のLet’s Encryptだけでなく、どのACME対応CAでも利用可能です。
Windows環境にてIISといったwebサービスを利用している際に、SSL証明書の発行・更新の自動化が可能であり、
タスクスケジューラを用いる為、細かい要件調整もしやすいです。
前提条件
今回検証に使用した環境です。
| Windows Server Version | 2022 Datacenter 10.0.20348 |
| PowerShell Version | 5.1.20348.4294 |
| 実行ユーザ | 管理者権限有(Administrator) |
| Webサービス | IIS 10.0.20348.1 |
| 認証局(CA) | GMOグローバルサイン(atlas) |
| ドメイン | iis.tnagai-wp.click |
| 認証方式 | HTTP-01 |
Posh-ACMEのインストール
PowerShellから、Install-Moduleを使用して、インストール方法が簡単です。Posh-ACMEとPosh-ACME.Deployをインストールします。この時、インストール先のユーザを絞る場合は、-Scopeから指定してください。
PS C:\Users\Administrator> Install-Module -Name Posh-ACME -Scope AllUsers
信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSRepository コマンドレットを実行して、リポジトリの InstallationPolicy
の値を変更してください。'PSGallery' からモジュールをインストールしますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Yを入力して<ENTER>
PS C:\Users\Administrator>
PS C:\Users\Administrator> Install-Module -Name Posh-ACME.Deploy -Scope AllUsers
信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSRepository コマンドレットを実行して、リポジトリの InstallationPolicy
の値を変更してください。'PSGallery' からモジュールをインストールしますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Yを入力して<ENTER>
PS C:\Users\Administrator>
インストール状況とバージョンが確認できます。
PS C:\Users\Administrator> Get-InstalledModule
Version Name Repository Description
------- ---- ---------- -----------
4.31.1 Posh-ACME PSGallery ACME protocol client for obtaining certificates using Let's Encrypt (or other ACME compliant CA)
2.1.0 Posh-ACME.Deploy PSGallery Deployment helper functions for Posh-ACME
その後、現在のセッションにモジュールをインポートします。
PS C:\Users\Administrator> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
PS C:\Users\Administrator> Import-Module Posh-ACME
PS C:\Users\Administrator>
これで、インストールは完了です。
ACMEアカウントの作成
ACMEプロトコルを使用する為には、どのCAであっても、ACMEアカウントの登録が必要です。
今回は、GMOのACMEサーバを接続先に指定します。
PS C:\Users\Administrator> Set-PAServer https://emea.acme.atlas.globalsign.com/directory
Please review the Terms of Service here: https://www.globalsign.com/en/repository/GlobalSign_Subscriber_Agreement.pdf
PS C:\Users\Administrator>
その後、ACME管理画面(Atlas)から発行したEAB(認証情報)を利用し、ACMEアカウントを発行します。
PS C:\Users\Administrator> New-PAAccount -ExtAcctKID MAC鍵識別⼦ -ExtAcctHMACKey MAC鍵 -Contact test@tnagai-wp.click -AcceptTOS
id status contact alg KeyLength
-- ------ ------- --- ---------
3AB9B33BE9A341DBB... valid {mailto:idc@netassist.ne.jp} ES256 ec-256
ACMEサーバ、MAC鍵識別子やMAC鍵はCAによって異なるので、適宜入力してください。
Posh-ACMEでSSL証明書を発行する方法
今回は、通常の公開サイトを想定して、HTTP-01認証(ファイル認証)を例に紹介します。
New-PACertificateコマンドで、証明書の発⾏申請をします。
このときサイトのルートディレクトリのパスを-PluginArgsとして下記の様に入力が必要です。
複数のFQDNを発行する場合は、コンマで区切ってFQDNを追加してください。
PS C:\Users\Administrator> New-PACertificate iis.tnagai-wp.click -Plugin WebRoot -PluginArgs @{WRPath ='C:\inetpub\iis.tnagai-wp.click'}
ここでは、恐らく多くのIIS環境では、下記のようなエラーメッセージが表示されます。
Submit-ChallengeValidation : Authorization invalid for iis.tnagai-wp.click: ~~~
認証用ファイルは、拡張子がない為、IIS側からコンテンツファイルとして認識されず、外部に配信されません。
その為、MIMEの種類を調整し、外部公開させる必要があります。
IIS管理画面上からも調整可能ですが、今回は直接、web.configを設置します。
C:\inetpub\iis.tnagai-wp.click\.well-known\acme-challenge\web.config
----------------------------------------------------
<configuration>
<system.webServer>
<staticContent>
<mimeMap fileExtension="." mimeType="text/plain" />
</staticContent>
</system.webServer>
</configuration>
----------------------------------------------------
ルートディレクトリ上に\.well-known\acme-challenge\といった認証用のファイルが作成されているので、
その中に、上記web.configを設置することで、認証用ファイルが読み込まれます。
では、気を取り直して、先ほどと同じNew-PACertificateコマンドを実施しましょう。
PS C:\Users\Administrator> New-PACertificate iis.tnagai-wp.click -Plugin WebRoot -PluginArgs @{WRPath ='C:\inetpub\iis.tnagai-wp.click'}
Subject NotAfter KeyLength Thumbprint AllSANs
------- -------- --------- ---------- -------
CN=iis.tnagai-wp.click 2027/04/10 17:23:37 2048 0B8F1951F3D85C56B904CCE08F46C603374BD11E {iis.tnagai-wp.click}
PS C:\Users\Administrator>
これで、証明書の発行は完了です。
IISに証明書を適用
次に、発行した証明書をIISに適用する必要がありますが、Get-PACertificate | Set-IISCertificateを使うだけで、簡単にできてしまいます。
PS C:\Users\Administrator> Get-PACertificate iis.tnagai-wp.click|Set-IISCertificate -SiteName iis.tnagai-wp.click -Port 443
PS C:\Users\Administrator> Get-WebBinding
protocol bindingInformation sslFlags
-------- ------------------ --------
http *:80: 0
http 163.43.142.183:80:iis.tnagai-wp.click 0
https *:443: 0
PS C:\Users\Administrator>
既存のバインド設定に上書きする形で適用する場合は、サイト名やポートの指定を正しく入力する必要があります。
誤っている場合、二重でバインドが作成されるので要チェック。
SSL証明書更新の自動化
あとは、証明書更新の自動化設定を追加します。
スクリプト作成
テキストエディタ等で下記ps1ファイルを作成しましょう。
Start-Transcript -Path "C:\acme_log\acme_log.txt"
try {
Set-PAServer https://emea.acme.atlas.globalsign.com/directory -Verbose
Set-PAOrder iis.tnagai-wp.click -Verbose
if ($cert = Submit-Renewal iis.tnagai-wp.click) {
Start-Sleep 10
$cert | Set-IISCertificate -SiteName iis.tnagai-wp.click -Port 443 -HostHeader iis.tnagai-wp.click -Verbose
}
}
finally {
Stop-Transcript
}
複数のACMEサーバやコモンネームを利用している場合は、Set-PAServerやSet-PAOrderで切り替える必要がありますので、適宜調整してください。
なおかつ、Set-IISCertificateの後のオプションもバインド設定やTLS要件に応じて、調整が必要です。
既存の443バインド設定と異なる設定で入力すると、更新ではなく、重複追加のような挙動になるので注意してください。
タスクスケジューラへの登録
キーボードの「Windows」キーを押しながら「R」キーを押し、「ファイル名を指定して実⾏」
を表⽰します。その後、「taskschd.msc」と入力し、OKを押すとタスクスケジューラが起動します。
タスクスケジューラから「タスクの作成」を押します。

任意の名前を「名前」に入力し、セキュリティオプションにある「ユーザーがログオンしているかどうかに関わらず実⾏する(W)」を選択します。

次に「トリガー」タブを押し、「新規」ボタンからトリガー条件を作成します。

新しいトリガーが表示されたら、設定を「毎日(D)」を選択し、「開始(S)」には、任意の更新時間を入力して、OK。

最後に「操作」タブの「新規」を押して、スクリプト実行内容を作成します。

操作の編集が表示されるので、プログラム/スクリプトには下記を入力、
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加(オプション)には、-Command “作成したps1ファイルのパス”を⼊⼒し、「OK」をクリックします
(例︓-Command “C:\renew-cert.ps1″)。

タスクの作成に戻り、最後にもう1回OKを押すことで完了です。
この設定にて、Posh-ACMEが毎日特定の時間で更新確認動作が行われますが、
毎日SSL更新が行われるわけではなく、残有効期限が30日のタイミングで更新されるので注意です。
紹介は以上となりますが、要件に応じては月1回の強制更新が必要であったり、
他アプリケーションへの証明書更新が必要であれば、適宜調整が必要です。
もし、お困りでしたらネットアシストにご相談を!


