Let’s Encrypt更新でTLS-SNI-01 challengeエラーを回避

2016/10/18[公開] 2017/02/11[最終更新]

 家の自宅サーバーのLet’s Encrypt証明書ですが、未稼働のサブドメインの証明書を発行したり、SANにサブドメインをいろいろ追加登録して試しているうちに、certbot-auto renewコマンドで自動更新しようとしても、Incorrect validation certificate for TLS-SNI-01 challenge.のエラーで更新できなくなってしまいました。

(2017/02/11追記)この記事公開のあと、2か月毎に2回ほど自動更新に成功しましたが、その後、実利用していないサブドメインを含む証明書が更新できなくなりました。おそらくサーバー再起動後から更新できなくなったと推測されます。やはり、実稼働中のドメインとそのサブドメインだけで証明書を作成したほうがよさそうです。

——以下、公開時そのままの情報です。サーバー再起動で無効になる内容が含まれています。——

 いろいろ試して、これから利用するかもしれない実在しないサブドメインの証明書でも、cronで自動更新できるようになった設定内容です。Debian Jessieのapache2での内容です。複数サブドメインの証明書を発行した過去記事の続きです。

このページの目次

スポンサー リンク

acme-challenge用のディレクトリを作る

 先に設定方法を書きますが、ArchWikiのLet’s Encryptのページを参考にして、Arch linuxのやり方を、Debian Jessieのapache2に置き換えて設定したら上手くいきました。

複数のドメインあるいはサブドメインを使用する場合、全てのドメインに対して、/.well-known/acme-challenge/ への http リクエストを全て一つのフォルダ (例: /var/lib/letsencrypt) にまとめることで、マルチドメインの管理がとても楽になります。

引用:ArchWiki let’s encrypt

/var/lib/letsencryptを作成

 まずは、/var/lib にletsencryptディレクトリを作成します。

mkdir /var/lib/letsencrypt

 ディレクトリの所有者をapacheに変更しておきます。Debianのapacheの場合は、www-data:www-dataを所有者にします。その他のディストリではapache:apacheになるはずです。

chown -R www-data:www-data /var/lib/letsencrypt

 certbotクライアントのパスから設定したパスに書き込めるようにしておきます。

chmod g+s /var/lib/letsencrypt

/etc/apache2/sites-availableに設定

 各ドメイン/.well-known/acme-challenge/へのチャレンジ・レスポンス認証を、/var/lib/letsencryptをエイリアスにまとめることで、複数サブドメインでの管理が楽になるうえに、実在しないこれから利用したいサブドメインのチャレンジ・レスポンス認証も可能にしてくれます。

 /etc/apache2/sites-availableディレクトリに、letsencrypt.confファイルを作成します。ファイルの中身を下記のように記述します。

Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"

<Directory "/var/lib/letsencrypt/">
    AllowOverride None
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

設定したletsencrypt.confを有効にします。

a2ensite letsencrypt

サービスをリロードして反映させます。

service apache2 reload

 

Cronで自動更新をしたい

 Let’s Encryptのrenewコマンドで自動更新をさせたいのです。証明書の有効期限が3ヶ月しかないので、だいたい2ヶ月超えたら更新していかないといけません。手動で更新していたら面倒ですし、たぶんそのうちポカして更新を忘れます。

 certbot-auto renewコマンドなら、有効期限残り30日を切っていたら更新、それ以上ならチェックのみで更新見送りしてくれます。これをcronで週一か月一で実行しておけば、証明書の自動更新ができるわけです。

 テスト時には、certbot-auto renew –force-renewal のオプションを付ければ、有効期限残りが30日以上あっても、強制的に更新を実行してくれます。

エラー内容

 実在するドメインのサブドメインだけで発行した証明書のときは、apacheが稼働中でもcertbot-auto renewが成功していたのですが、実在しないサブドメインを含めたとたんに、更新しようとすると下記のようなエラーが出て更新できなくなりました。

 DNSのAレコードの設定を見直せと出ていますが、DNSサーバーのAレコードに、「*」のワイルドカードで*.def-4.comのAレコードを設定しているので、それが原因とは考えられません。

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: tatoeba.def-4.com
   Type:   unauthorized
   Detail: Incorrect validation certificate for TLS-SNI-01 challenge.
   Requested
   4f9b78b6c13.1004dd2328e2be9b831127.acme.invalid
   from 202.***.***.***:443. Received certificate containing
   'def-4.com, www.def-4.com'

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address.

更新できるようになった

 上記の設定をしたところ、certbot-auto renew –force-renewal コマンドで更新成功するようになりました。apacheのリロード無しでブラウザーの有効期限が伸びているのを確認できました。実際にcronに設定したcertbot-auto renewで自動更新が成功するかは、2ヶ月後の動作確認を待つことになりました。(2016/11/18追記)cronでの自動更新成功確認済み

コメントを残す

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