MENU

Windows ServerでPosh-ACMEを使ったSSL証明書の自動更新方法

こんにちは、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 Version2022 Datacenter 10.0.20348
PowerShell Version5.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-ACMEPosh-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-PAServerSet-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回の強制更新が必要であったり、
他アプリケーションへの証明書更新が必要であれば、適宜調整が必要です。
もし、お困りでしたらネットアシストにご相談を!

参考:
https://poshac.me/docs/v4/

お問い合わせ

この記事をシェアする
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

猫とお酒好き
さくらのクラウド検定取得

目次