Windows で Letsencrypt.sh を使う-#1

投稿アップデート情報  追記(9/19) 追記2(10/26) 追記3(2017/7/9)

[2017/10/20 時点の話] ApacheLounge 2.4.x 版でも mod_md が使えるようになったので、 dehydrated ( 旧 Letsencrypt.sh) の代わりに、今はこれを使っている。この件に関する記事→「Let’s Encrypt 証明書の更新方法を dehydrate から mod_md に」。
========================================================
[10/26 時点の話] 鍵交換に Elliptic curve Diffie–Hellman を使うようにしたので,その件についての記事を書いた。「Windows で Letsencrypt.sh を使う-#4
========================================================
[9/19 時点の話] 無事,証明書の自動更新が成功したので,その件についての記事を書いた。☞「Windows で Letsencrypt.sh を使う-#3
 また,当該スクリプトのプロジェクト名が letsencrypt.sh から dehydrated に変わり,リポジトリも https://github.com/lukas2511/dehydrated/releases になったので,記事内の letsencrypt.sh は dehydrated に読み替えてほしい。
========================================================
 この間書いたようにletsencrypt-win-simple が Windows 版の Apache 上での証明書更新作業に対応していないし,公式のクライアントである certbot も,同様の状態みたいなので, letsencrypt.sh というスクリプトを使う方法を考えてみた。

 ‘Run native Bash on Ubuntu on Windows’ という話が完全になれば, Windows10 上で sh ファイルを動かすのも楽になるかもしれないが,まだ, Insider Preview での話にとどまってるみたいだし,もともと自鯖は Windows7 で動いているわけだから, sh は Cygwin で動かすことにした。準備としては, setup-x86.exe を走らせ, wget と apt-cyg を追加インストールした。
 この辺のインストールのやり方については,「Cygwin 上で h2load をビルドする」をご覧ください。

  1. スクリプトのダウンロードおよび更新に, git を使うのでインストール。
    $ apt-cyg install git
  2. $ cd /usr/local
    $ git clone https://github.com/lukas2511/letsencrypt.sh
    $ cd letsencrypt.sh
    ファイルを最新にしておく。
    $ git pull https://github.com/lukas2511/letsencrypt.sh
  3. Letsencrypt.sh には curl がいるので,これをインストール。
    $ apt-cyg install curl

 letsencrypt.sh のテストを行う。

  1. [docs/wellknown.md] と [docs/domains_txt.md] に目を通したのち, domain.txt を作成。
    $ cd /usr/local/letsencrypt.sh
    $ vi domain.txt
  2. 我が家の domain.txt はこんな感じである。

  3. $ cd /usr/local/letsencrypt.sh
    $ cp docs/examples/config .
    $ vi config
    config ファイルの以下の行を編集。

    #CA="https://acme-v01.api.letsencrypt.org/directory"
      ↓
    CA="https://acme-staging.api.letsencrypt.org/directory"
     * テスト中のみ。
    
    #BASEDIR=$SCRIPTDIR
      ↓
    BASEDIR="/cygdrive/c/Users/UserID/AppData/Roaming"
     * どこにおいても構わないが,セキュリティを考慮のこと。
    
    #DOMAINS_TXT="${BASEDIR}/domains.txt"
      ↓
    DOMAINS_TXT="${SCRIPTDIR}/domains.txt"
    
    #WELLKNOWN="${BASEDIR}/.acme-challenges"
      ↓
    WELLKNOWN="/cygdrive/x/Apache24/htdocs/.well-known/acme-challenge"
     * 実のところ, letsencrypt-win-simple によるデータがすでに '.well-known/acme-challenge' にあるので,これを letsencrypt.sh で使えるように前と同じ場所にした。
  4. テストする。
    $ cd /usr/local/letsencrypt.sh
    $ ./letsencrypt.sh -c
    以下のようなメッセージが出る。

    # INFO: Using main config file /usr/local/letsencrypt.sh/config
    + Generating account key...
    + Registering account key with letsencrypt...
    Processing o6asan.com with alternative names: www.o6asan.com test.o6asan.com
     + Signing domains...
     + Generating private key...
     + Generating signing request...
     + Requesting challenge for o6asan.com...
     + Requesting challenge for www.o6asan.com...
     + Requesting challenge for test.o6asan.com...
     + Responding to challenge for o6asan.com...
     + Challenge is valid!
     + Responding to challenge for www.o6asan.com...
     + Challenge is valid!
     + Responding to challenge for test.o6asan.com...
     + Challenge is valid!
     + Requesting certificate...
     + Checking certificate...
     + Done!
     + Creating fullchain.pem...
     + Done!

    ちゃんと終わったら,証明書は ${BASEDIR}/certs/YourDomain にできている。

 さて,本番。

  1. config ファイルの下行を元に戻す。
    CA="https://acme-staging.api.letsencrypt.org/directory"
      ↓
    #CA="https://acme-v01.api.letsencrypt.org/directory"
  2. 以下をやる。
    $ ./letsencrypt.sh -c -x
    * -x (–force) というのは,強制更新のオプションで,今回の場合,テストで得たフェイク証明書の期限が残っているので,これが必要になる。無事終わると, (${BASEDIR}/certs/YourDomain) に以下の 10 ファイルができる。

    cert.csr  cert.pem  cert-xxxxxxxxxx.csr  cert-xxxxxxxxxx.pem
    chain.pem  chain-xxxxxxxxxx.pem  fullchain.pem
    fullchain-xxxxxxxxxx.pem  privkey.pem  privkey-xxxxxxxxxx.pem
  3. $ ./letsencrypt.sh -gc
    * -gc はクリーンアップオプションで,使われていない証明書を保管庫に移動してくれる。今回の場合は,フェイク証明書がお引越しすることになる。

 Apache2.4.8 以上を使っている場合, fullchain.pem と privkey.pem があればいいのだが,ここで問題にぶち当たった。 Letsencrypt.sh が作る fullchain.pem, privkey.pem は LINUX フォーマットのシムリンクファイルだった。当然, Windows OS では使えない。というわけで, fullchain-xxxxxxxxxx.pem と privkey-xxxxxxxxxx.pem を server.crt と server.key として,サーバの証明書ディレクトリにコピーしてやった。

cmd.exe を管理者として,起動。
>pushd ${BASEDIR}/certs/YourDomain
>copy /Y fullchain-xxxxxxxxxx.pem \pathto\server.crt
>copy /Y privkey-xxxxxxxxxx.pem \pathto\server.key
>x:\Apache24\bin\httpd -k stop
>x:\Apache24\bin\httpd -k start

 以上。

 あとはどうやって自動更新するかという問題だが,これは,次記事で書くつもりです。

追記3(2017/7/9):

 1 週間くらい前に, Let’s Encrypt 製の証明書の更新がうまく行ってないのに気づいた。アレッとは思ったが手動ですればいいやと更新したら,これでもエラーが出た。エラーは 403 で, “.well-known/acme-challenge” にアクセスするときに出てるみたいだった。何で,突然出るようになったんだといろいろ調べて,結局, BPS のせいだということが分かった。自鯖の “.well-known/acme-challenge” は Document Root にあるのだが ― ここは WordPress の base ディレクトリでもある ― 新バージョンでさらにルールが強化された BPS が,ここへのアクセスを締め出してしまったようだ。

 というわけで, “.well-known/acme-challenge” を別の場所に移動し, apache2.4 用に conf を 1 枚。中は, Alias の定義である。
Alias /.well-known/acme-challenge "/pathto/.well-known/acme-challenge/"

<Directory "/pathto/.well-known/acme-challenge/">
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>

 そういえば,前にくりくりさんのお話から,「CertbotWebサーバー証明書更新エラー とApache起動不能」に答えを書き込んだ際に,「Let’s encrypt のWeb認証に失敗する場合の許可の通し方」をリンクしたが,今回の件と似てるよなと,すべての対処が終わったあとで,思い出した(苦笑)。

コメントを残す

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

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