SSL for Free を用いて Let’s Encrypt を発行する方法を公開していましたが、
やはり Windows であれば、win-acme を使って発行し、
自動で更新できるようにしておきたいところです。
この手順がようやくできたので、メモ書きに残しておきます。

04WebServer

GUI で設定できる Web サーバ。SSL 対応。個人などの小規模用途であれば十分です。

Let’s Encrypt

Let’s Encrypt は無料ですぐに発行できる SSL サーバ証明書。
信頼性を重要視する企業であれば実在証明による EV 証明書も検討すべきですが、
個人用途はドメイン認証での発行になるので、Let’s Encrypt で十分でしょう。
Let’s Encrypt の登場により、
Web サイトは常時 SSL 化が必須になった、ともいえそうです。

win-acme - A Simple ACME Client for Windows (for use with Let’s Encrypt)

Let’s Encrypt を発行する手段はいくつかあります。
win-acme は Windows 実行ファイルによる動作、CLI による表示で発行を行います。
オプション指定で完全無人動作が実現できるので、
Windows で稼働するサーバに導入しやすいところが採用されているポイントでしょう。

win-acme の実行画面

……という事で、win-acme での発行手順を進めていきます。
実際に使用するサーバで作業を行います。

Release のところで実行ファイルがダウンロードできます。
win-acme.v(バージョン番号).zip で良いです。

Releases - PKISharp/win-acme| GitHub

.zip ファイルなので、問題なく解凍して中身を表示できますね。
この中身にある acme.exe を実行します。クリックで起動して OK です。
実際の画面と共に説明していきます。

 [INFO] A simple Windows ACMEv2 client (WACS)
 [INFO] Software version 2.0.4.225 (RELEASE)
 [INFO] IIS not detected
 [INFO] Please report issues at https://github.com/PKISharp/win-acme


 M: Create new certificate with advanced options
 L: List scheduled renewals
 R: Renew scheduled
 S: Renew specific
 A: Renew *all*
 O: More options...
 Q: Quit

 Please choose from the menu: ■

Let’s Encrypt はすでに過去発行しているのですが、
発行している環境が異なり、win-acms は発行している事を認識していません。
ここでは M を選択して新規発行で進めていきます。

 Please choose from the menu: m

 [INFO] Running in mode: Interactive, Advanced

 1: Manually input host names
 <Enter>: Abort

 Which kind of certificate would you like to create?: ■

選択肢は一つしかありません。1 で良いですね。

 Which kind of certificate would you like to create?: 1

 Enter comma-separated list of host names, starting with the common name: ■

発行するホスト名を入力します、, 区切りで複数指定ができます。
自作・自社サーバの場合、IP アドレスが一つしかないので、
複数指定が必須になるでしょう。必要なホスト名を全て入れて下さい。
サブドメインを使用している場合、*.domain.ext とワイルドカードも有効です。

自分は fusen.ddns.net しか使っていません。他は外部のサービスです。
なので fusen.ddns.net のみで進めます。

 Enter comma-separated list of host names, starting with the common name: fusen.ddns.net

 [INFO] Target generated using plugin Manual: fusen.ddns.net

 Suggested FriendlyName is '[Manual] fusen.ddns.net', press enter to accept or type an alternative: ■

わかりやすい名前を付けて下さいね~ですね。
他に発行する必要がないので、何も入れずに Enter としました。

 Suggested FriendlyName is '[Manual] fusen.ddns.net', press enter to accept or type an alternative: <Enter>

 1: [dns-01] CNAME the record to a server that supports the acme-dns API
 2: [dns-01] Manually create record
 3: [dns-01] Run script to create and update records
 4: [http-01] Host the validation files from memory (recommended)
 5: [http-01] Save file on local or network path
 6: [http-01] Upload verification file to WebDav path
 7: [http-01] Upload verification files via FTP(S)
 8: [http-01] Upload verification files via SSH-FTP
 C: Abort

 How would you like to validate this certificate?: ■

さて、ここが重要。サーバを使用している事を確認する方法の選択です。
大きくネームサーバ(DNS)にレコードを追加して確認する方法と
Web サーバにファイルを入れて確認する方法があります。

今回は fusen.ddns.net で、ダイナミック DNS サービスなので、
他のネームサーバを追加する事ができません。なので http、
更に Webdev や FTP ではなく、ファイルを直接入れて公開しているので、
ローカル・ネットワークパスの 5 を選択します。

なお、ワイルドカードを使用する場合は、ネームサーバによる方法が必須となります。

 How would you like to validate this certificate?: 5

 Path to the root of the site that will handle authentication: ■

サイトのルートパス。http(s)://fusen.ddns.net/ で参照する場所ですね。

fusen.ddns.net/ の設定

ここで、04WebServer の画面。fusen.ddns.net は特殊な設定にしていて、
https://fuusen.ddns.net/ は https://balloon.tk/ の転送にしています。
この転送設定、当初嵌りました。
LocalPath が空白になっていないと Forward が機能しないんです。
どこにも書いてないようなので、これも入れておきます。

fusen.ddns.net/.well-known の設定

でも、Let’s Encrypt では http(s)://(サーバ名)/.well-known/acme-challenge/ 内に
任意のファイルを生成し、このファイルがある事で確認をしています。
そこで D:\Dropbox\No-IP\.well-known 内を
http(s)://fusen.ddns.net/.well-known で割り当てています。

従って .well-known の一つ上層、D:\Dropbox\No-IP\ を設定し、
ファイルを置いた場所を直接参照できるようにします。

win-acme では半角 ¥ を半角 \ と表示します。だから入力は ¥ ですよ。
……というか、¥ で表示するのは日本語だけで、
海外では \ 表示が当たり前だったりするのですが……
という事で、このブログもフォントの影響で、半角 ¥ は半角 \ になる仕様です。

 Path to the root of the site that will handle authentication: D:\Dropbox\No-IP

 Copy default web.config before validation? (y/n*)  - ■

ここは y で構いません。

 Copy default web.config before validation? (y/n*)  - yes

 1: Elliptic Curve key
 2: Standard RSA key pair

 What kind of CSR would you like to create?: ■

2 がデフォルトになっているかと思います。そのまま Enter としました。

 What kind of CSR would you like to create?: <Enter>

 1: IIS Central Certificate Store
 2: Windows Certificate Store
 3: Write .pem files to folder (Apache, ngnix, etc.)

 How would you like to store this certificate?: ■

1 は IIS、2 は Windows 証明書ストア です。
今回は 04WebServer を使用するので、
Apache や nginx と同じ 3 を選択します。

 How would you like to store this certificate?: 3


 Path to folder where .pem files are stored: ■

証明書ファイルを置く場所。これは Web サーバで参照されない場所にして下さい。
ここでは D:\Dropbox\No-IP\fusen.ddns.net としていますが、
D:\Dropbox\No-IP 内を公開しているのであれば、この中ではダメですよ。
分かる人なら http(s)://fusen.ddns.net/fusen.ddns.net/ 内の
証明書ファイルを参照してしまいますよ。

 Path to folder where .pem files are stored: D:\Dropbox\No-IP\fusen.ddns.net

 1: Do not run any installation steps
 2: Run a custom script
 <Enter>: Abort

 Which installer should run for the certificate?: ■

ここは 1 でインストールを進めましょう。

 Which installer should run for the certificate?: 1

 Enter an email address to be used for notifications about potential problems and abuse: ■

メールアドレスを入力します。
実際にはちゃんと入力していますが、ここでは非公開です。
~@gmail.com とかですね。

 Enter an email address to be used for notifications about potential problems and abuse: (メールアドレス)

 Terms of service:   C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org\LE-SA-v1.2-November-15-2017.pdf

 Open in default application? (y/n*)  - yes

 Do you agree with the terms? (y*/n)  - ■

利用規約の PDF ファイルです。
デフォルトアプリケーションは Acrobat Reader DC が多いでしょうか。
利用規約を承認します。y を選択です。

 Do you agree with the terms? (y*/n)  - yes


 [INFO] Authorize identifier: fusen.ddns.net
 [INFO] Authorizing fusen.ddns.net using http-01 validation (FileSystem)
 [INFO] Answer should now be browsable at http://fusen.ddns.net/.well-known/acme-challenge/Z(ランダムな文字列)g
 [INFO] Preliminary validation looks good, but ACME will be more thorough...
 [INFO] Authorization result: valid
 [INFO] Requesting certificate [Manual] fusen.ddns.net
 [INFO] Exporting .pem files to D:\Dropbox\No-IP\fusen.ddns.net
 [INFO] Installing with None...
 [INFO] Adding Task Scheduler entry with the following settings
 [INFO] - Name win-acme renew (acme-v02.api.letsencrypt.org)
 [INFO] - Path C:\Users\(ユーザー名)\Downloads\win-acme.v2.0.4.225
 [INFO] - Command wacs.exe --renew --baseuri "https://acme-v02.api.letsencrypt.org/"
 [INFO] - Start at 09:00:00
 [INFO] - Time limit 02:00:00

 Do you want to specify the user the task will run as? (y/n*)  - ■

無事に発行され、証明書発行が保存されました。
更に証明書の更新するためのコマンドもインストールしようとしています。
ユーザー権限であれば y でユーザー名とパスワードを入力します。

 Do you want to specify the user the task will run as? (y/n*)  - yes

 Enter the username (Domain\username): (Windows のユーザー名)

 Enter the user's password: (Windows ユーザーのパスワード)

 [INFO] Adding renewal for [Manual] fusen.ddns.net
 [INFO] Next renewal scheduled at 2019/5/3 17:51:45

 M: Create new certificate with advanced options
 L: List scheduled renewals
 R: Renew scheduled
 S: Renew specific
 A: Renew *all*
 O: More options...
 Q: Quit

 Please choose from the menu: ■

これで証明書の発行と更新コマンドのインストールが完了です。
メインメニューに戻りましたので、念の為 L で表示してみます。

 Please choose from the menu: l

 1: [Manual] fusen.ddns.net - renewed 1 time, due after 2019/5/3 17:51:45
 <Enter>: Back

 Show details for renewal?: ■

無事に認識されています。2019年5月3日 以降に更新実施予定ですね。
ギリギリでは失敗して再試行する間に期限切れとなってしまう恐れがあるので、
win-acme に限らず数週間~1 ヶ月前から更新作業を行うのが一般的です。

無事に証明書を発行

という事で無事に証明書が発行できました。2 つファイルができています。

04WebServer SSL 設定

この証明書を 04WebServer に入れる場合は、左項目 サーバ設定
右項目 サーバ基本設定 を選択し、上の SSL/TLS(HTTPS) タグを選択、
次の項目を選択します。

  • 秘密鍵ファイル - (サーバ名など)-key.pem
  • サイト証明書ファイル - (サーバ名など)-chain.pem

なお、秘密鍵のパスワードはそもそも設定していないので空白で良いのですが、
それでも伏せ字の **** が表示されます。
サーバ再起動 で、設定が読み込まれ、新たな証明書が参照されます。

それでは早速参照して確認してみます。

04WebServer SSL 設定

無事に 2019年3月9日(作業実施日・記事投稿日)からの証明書になりました。
更新も行われるので、これで安心して運用できますね。


追記 2019年5月5日

04WebServer SSL 設定

2019年5月4日 午前 9 時、証明書が自動的に更新されていました。
発行から 55 日後、タスクスケジューラは午前 9 時動作になっています。
2019/5/3 17:51:45 以降はじめての午前 9 時に無事更新されました。

https://github.com/PKISharp/win-acme/wiki/Renewal-Management
https://github.com/PKISharp/win-acme/wiki/Task-Scheduler

タイミングによって更新に失敗する可能性があり、
最悪期限切れになってしまう恐れもあるので、
発行から 2 ヶ月(期限 1 ヶ月前)位で更新作業をはじめるシステムが多いです。

これで安心して運用できますね。