Windows 上の Apache に SAN 対応の Let’s Encrypt 製証明書を導入する。

投稿アップデート情報  追記(4/11) 追記2(6/23) 追記3(10/13)

[2017/10/20 時点の話] ApacheLounge 2.4.x 版でも mod_md が使えるようになったので、 dehydrated ( 旧 Letsencrypt.sh) の代わりに、今はこれを使っている。この件に関する記事→「Let’s Encrypt 証明書の更新方法を dehydrate から mod_md に」。
========================================================
【2016.7.19時点の話】
 今のところ, letsencrypt-win-simple は Windows 版の Apache 上での証明書更新作業に対応していないし,公式のクライアントである certbot も,同様の状態みたいなので, letsencrypt.sh というスクリプトを使う方法を考えてみた。☞「Windows で Letsencrypt.sh を使う-#1」
========================================================
 一昨日,これを書いた。あの時点での Let’s Encrypt 製証明書は o6asan.com に対してだけだった。

 自鯖の環境の中で今回の件に関係があるのは,以下の通り。

  1. Windows7 HE SP1 (x86)
  2. Apache2.4.x with VC14

 3/9 に ‘New Name, New Home for the Let’s Encrypt Client‘ という記事が出てたけども, 公式クライアントソフトは今も Windows をサポートしていない。 List of Client Implementations に Win 用クライアントが 2つあったが, SAN 対応ということを視野に入れて, letsencrypt-win-simple を使うことにした。 Oocx.ACME については, SAN についてのページを見つけられなかったからだが,見つけられなかっただけで,もしかしたら対応しているのかもしれない。

 letsencrypt-win-simple を使うことにしたので,それについて書いていこう。
 ここ 2 ・ 3 日で, o6asan.com 用の証明書を 3 回作った。参考 URL
 1 度目は, o6asan.com にだけ対応したもの。 letsencrypt.exe を使った。
 2 度目は, letsencrypt.exe --san を使ったんだが, 100 個までに使える SAN 対応証明書を作れるとウキウキしていて,ドジった。 ‘o6asan.com’ を Alternate server names に入れ落としたのだ。結果として,こんなのが表示されることとなった。これは, juneさんからいただいた。 Grrr。
 当然,作り直したよ。ようやく SAN 対応証明書が手に入った。 letsencrypt.exe --san でやった。自分をほめてやりたいわぁ \(^O^)/。

  1. letsencrypt-win-wimple-vx.x.x-Pre-Release.zip をダウンロードする。現時点では, v1.8.9。
  2. zip を展開し,サーバ上のどこかに置く。私の場合は, C:\letsencrypt-win にした。 ‘letsencrypt-win’ に展開したファイルが入っている。展開ファイル中に libeay32.dll と ssleay32.dll が含まれていたが,バージョンが 1.0.2a だったので, 1.0.2g のものと置き換えた。
  3. cmd.exe を管理者として実行。
  4. フォルダ ‘letsencrypt-win’ に移動。
  5. >letsencrypt.exe --san
    以下のメッセージが表示される:

    (省略)
    Config Folder: C:\Users\UserID\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org
    Certificate Folder: C:\Users\UserID\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org
    (省略)
    Enter an email address (not public, used for renewal fail notices):

    使用可能な email address を入力。

    (省略)
    Do you agree to https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf? (Y/N)

    ‘Y’ を入力。

    (省略)
     W: Generate a certificate via WebDav and install it manually.
     S: Generate a single San certificate for multiple sites.
     F: Generate a certificate via FTP/ FTPS and install it manually.
     M: Generate a certificate manually.
     A: Get certificates for all hosts
     Q: Quit
    Which host do you want to get a certificate for:

    このクライアントソフトの自動生成は,今のところ Apache に対応していないので, ‘M’ を入力。

    Enter a host name:

    ‘example.com’ を入力。  ☜ 勿論,実際はあなた自身が使っているホスト名を入れる。

    Enter all Alternative Names separated by a comma

    ‘example.com,www.example.com’ という感じで入力。

    Enter a site path (the web root of the host for http authentication):

    DocumentRoot のパスを入力。
    オプションなしで, letsencrypt.exe を走らせると,ここでエラーが出るようだ。その場合は, webroot オプションを使うとうまくいく。
    letsencrypt.exe --manualhost example.com --webroot サイトのDocumentRoot
    という感じで走らせる。

    クライアントが証明書や他の準備をする間ちょっと間があって,その後,以下のメッセージが表示される:

    Do you want to specify the user the task will run as? (Y/N)

    私は ‘Y’ を入力し, UserID とパスワードを入れたが,この情報は,図 1 のタスクで使われるので,どちらを選ぶかは各人の環境によると思う。これで,新しい証明書作成が完了した。

letsencrypt daily task
図 1
 クライアントは, sever-crt.pem と ca-xxxx-crt.pem を作ってくれるが, OpenSSL1.0.2 と 2.4.8 より新しい Apache を使っているので,両方を結合した証明書が望ましい。
 
 というわけで, cmd.exe で以下の操作をやった:
> copy sever-crt.pem + ca-xxxx-crt.pem server.crt
 ここは,今のところ手作業だが,証明書の次の書き換えの 5 月までには自動化する必要がある。でないと,サイトで期限切れが表示される可能性がある。
 
 毎度ながら SSLLabs でテストしてみた。 ☞ SSL_Server_Test_o6asan_com4.html
 えーっと,上のファイルの URL に気づいてもらえたかな? test.o6asan.com になってるのだ。加えて,ブラウザのアイコンは test.o6asan.com に対して何も警告を表示していないと思う。新証明書の威力だよ。最高!
 

追記(4/11):

 そういえば, fullchain.pem( つまり server.crt) をどうやって自動更新するかという問題について,追記を忘れていたんだけども,多分,以下の bat で解決できると思う。多分というのは,まだ 1 回も実際の更新があってないからネ。:
@echo off
pushd C:\Users\UserID\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org
copy /Y C:\letsencrypt-win\list.txt C:\letsencrypt-win\list-old.txt
C:\letsencrypt-win\letsencrypt.exe --renew --baseuri "https://acme-v01.api.letsencrypt.org/"
forfiles /m *.pem /C "cmd /c echo @file @fsize @fdate @ftime" >C:\letsencrypt-win\list.txt
fc /L C:\letsencrypt-win\list.txt C:\letsencrypt-win\list-old.txt
if %errorlevel%==0 goto not_do_anything
if %errorlevel%==1 goto cpy
popd
exit
:not_do_anything
popd
exit
:cpy
copy /Y sever-crt.pem + ca-xxxx-crt.pem \pathto\server.crt
copy /Y server-key.pem \pathto\server.key
popd
exit
 bat の名前は “letsencrypt.bat” にした。これ用の新タスクをこさえてやり,デフォルトのデイリータスクと置き換える。新旧のタスクの属性は同じである。
 
 もし使ってみようという方がいたら, 2 ・ 3 準備がいる。

  1. テキストエディタで bat を作る。もちろん,パスとかは自環境に合わせてくだされ。
  2. 新タスクを作る。当然,旧のほうは止める。新タスクが上手く動くことが分かるまでは,旧を削除しないほうがいいでっせ。
  3. cmd.exe を起動して,下記のコマンドをやる。
    pushd C:\Users\UserID\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org
    forfiles /m *.pem /C "cmd /c echo @file @fsize @fdate @ftime" >C:\letsencrypt-win\list.txt

 以上!

追記2(6/23):

 上記の bat を作ったんだけども,どうやら, letsencrypt-win-simple の更新能力について,勘違いしていたようだ。 letsencrypt-win-simple は今のところ,Windows 上の Apache での証明書更新をサポートしていないようだ。 5/12 から更新作業ができるはずで,スクリプトは下記のメッセージを吐き出していたが,実際には更新が行われていなかった。

Checking Renewals
 Checking Manual MyDomain.com (My DocumentRoot) Renew After 2016/07/12

 そのせいで, 6/1 と 6/10 の 2 回 “Let’s Encrypt certificate expiration notice” をメールで受け取った。 “Unable to force renewal” ということらしいので,今回は,更新をあきらめて,新しい証明書を取った。 GitHub の issues に Thumbs up を付け加えたほか,今もほかにいい方法がないか探している。

追記3(10/13):

 更新時のバクが直っているという情報を Steffen からもらった。今のところ,コンパイル済みのファイルは gdau のコメント上にある。自分ではテストしていないが,次のバージョンではマージされる機能ではないかと思う。

「Windows 上の Apache に SAN 対応の Let’s Encrypt 製証明書を導入する。」への2件のフィードバック

  1. おはようございます。

    会社のドメイン数が多いのでlet`s encryptと有料の証明書の両方併用をかんがえていました。

    しかし、let`s encryptはドメイン数の制限が100だからサブドメインも含めてと思っていましたが、コモンネームでsan`sにいれられるのら費用を抑えることができそうです。

    1. くりくりさん,こんにちは。

      私が読んだのは, Rate Limits for Let’s EncryptFAQ 程度なんですが,証明書の制限で気が付いたのは,

      1 期間が 90 日間であること。更新失敗も考慮に入れて, 60 日を過ぎたら,更新するように書かれていました。
      2 今のところ,ワイルドカード証明書に対応していないこと。
      3 SAN に対応はしているが,内包できるサーバネーム数が 1 枚につき 100 までであること。
      4 レジスタドメイン 1 つにつき,週あたりの証明書再発行は, 5 回までであること。
      5 この 5 は ACME クライアントの開発環境に関係すると思われますが,保留中の Authorizations/Account に制限を設けているようです。今のところ,週当たり 300 アカウントにセットされています。
      6 異なるドメインについての証明書発行数には制限はない

      ということくらいです。サブドメインがちょくちょく増えたり減ったりするホストでは,ワイルドカードが使えないのは,不便ですよね。
      まだまだ,学習中です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください