はじめに
Let’s encryptの中の人から「Action required: Let’s Encrypt certificate renewals」というタイトルの以下のようなメールが来ました。
Hello,
* * Action is required to prevent your Let’s Encrypt certificate renewals from breaking.* *
Your Let’s Encrypt client used ACME TLS- SNI-01 domain validation to issue a certificate in the past 60 days.
TLS- SNI-01 validation is reaching end - of - life and will stop working on * * February 13 th, 2019. * *
You need to update your ACME client to use an alternative validation method (HTTP-01 , DNS-01 or TLS- ALPN-01 ) before this date or your certificate renewals will break and existing certificates will start to expire.
If you need help updating your ACME client, please open a new topic in the Help category of the Let’s Encrypt community forum:
https:/ / community.letsencrypt.org/ c/ help
Please answer all of the questions in the topic template so we can help you.
For more information about the TLS- SNI-01 end - of - life please see our API announcement:
https:/ / community.letsencrypt.org/ t/ february-13 -2019 - end - of - life- for - all - tls- sni-01 - validation- support/ 74209
Thank you,
Let’s Encrypt Staff
…とのことで、本Webサイトで使用していたTLS-SNI-01によるドメイン認証を2019年2月13日でやめるとのことです。
そこでちょいと調べてみたところ、TLS-SNI-01によるドメイン認証には自分が所有していないドメインの証明書を取得できてしまうという脆弱性が発見されていた とのことです。2018年1月にこの脆弱性が発見されて以降、TLS-SNI-01によるドメイン認証での証明書の新規の取得は停止されていたそうです。
スポンサーリンク
それが、この度上記の脆弱性の発見以前にTLS-SNI-01によるドメイン認証での証明書を取得または更新していたサイトについても更新を終了する運びとなったようです。
実は、本Webサイトについては前回の証明書の更新からそれほど日数が経過していませんが、証明書の更新が失敗してしまうと復旧に手間取る可能性が考えられることや、Webサイトが停止してしまったりして精神的に余裕がない中で作業を行うことによる作業ミスなどといった不慮の二次災害の発生も予想されます。
そこで、精神的及び日程的に余裕のあるうちにドメイン認証の方法をHTTP-01に変更するための準備を行うことにしました。
この記事では、ドメイン認証の方法をHTTP-01に変更する準備作業時における試行錯誤について書きます。
なお、この記事はFedora 29上で実行した結果について記述しています。
スポンサーリンク
作業の前に、certbotを更新します。
ITインフラ的なサービスの提供元から前節のようなメールが来た場合には、関連するプログラム群を最新版に更新するのが定石です。
そこでroot権限で以下のコマンドを実行し、certbot等を更新します。
スポンサーリンク
更新の結果、バージョンが0.27.1から0.29.1に更新されます。
上記のコマンドのうち、2番目のコマンドによってpython3-acmeパッケージがインストールされます。
また、0.28.0の時点でTLS-SNI-01によるドメイン認証がdeprecatedになるとのことです。
certbotを実行します。
1st try: TLS-ALPN-01に挑戦。
次に、root権限で以下のコマンドを実行します… と言いたいところなのですが、ちょっと寄り道してTLS-ALPN-01が使えないかと思って、以下のように入力して実行してみたのですが、
# certbot --preferred-challenges tls-alpn-01
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Which names would you like to activate HTTPS for ?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1 : pandanote.info
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate numbers separated by commas and /or spaces, or leave input
blank to select all options shown (Enter ‘c’ to cancel): [Enterキーを押す]
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
You have an existing certificate that contains a portion of the domains you
requested (ref: /etc/letsencrypt/renewal/pandanote.info.conf)
It contains these names: pandanote.info
You requested these names for the new certificate: pandanote.info.
Do you want to expand and replace this existing certificate with the new
certificate?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(E)xpand/(C)ancel: E [Enterキーを押す]
Renewing an existing certificate
Performing the following challenges:
None of the preferred challenges are supported by the selected plugin
と出力されてしまい、惜しくも実行できませんでした。○| ̄|_
2nd try: HTTP-01でdry run。
よく考えてみると、前節の実行の方法では実際に更新が始まってしまう可能性がありました。
それはそれで予期せぬ結果を招きかねません。
スポンサーリンク
そこで、以下のコマンドを実行し、HTTP-01でドメイン認証ができるかどうか確認してみます。
# certbot renew --dry-run --preferred-challenges http-01 ,dns-01
ところが、出力メッセージの途中で…
Attempting to renew cert (pandanote.info) from /etc/letsencrypt/renewal/pandanote.info.conf produced an unexpected error : Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80 .. Skipping.
と赤文字で出力されてしまいました。
httpd.confの設定でport 80に対してVirtualHostの設定を追加せねばならないようです。(´・ω・`)
ここでいったんApache httpdに設定追加です。【-●_●)
そういえば、本Webサイトが稼働しているサーバは複数のドメインを割り当てているのをコロッと忘れていました(なお、実際の出力メッセージにはもう一つのドメインについてのメッセージも出力されているのですが、紙面の関係で省略しています?)ので、前節に示した出力メッセージで指示されたVirtualHostの設定および更新を以下の手順で行います。
Fedora 29のApache httpdでは/etc/httpd/conf.dの下に設定ファイルがありますので、そこに以下の設定を追加します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin panda@example.com
DocumentRoot /var/www/html
ServerName example.com
<IfModule mod_rewrite.c>
RewriteEngine on
# HTTP/1.1 is only available for this site.
RewriteCond %{THE_REQUEST} HTTP/(1\.0|0\.[0-9])$
RewriteRule ^(.*)$ - [R=403,L]
# Redirection to force HTTPS protocol.
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
</VirtualHost>
なお、上記の設定には6-14行目に以下の処理を行う設定を含んでいますが、これらの設定はあってもなくてもこの記事で記述しているHTTP-01によるドメイン認証のdry runは動作するようです。ただし、サーバ共通の設定として以下の設定を行っていた場合でもVirtualHost側には以下の設定は引き継がれませんので、サーバ共通の設定と同じものにしたい場合には当該部分をコピペする必要があります。
HTTP接続されたリクエストをHTTPS接続にリダイレクトする設定(詳細はこちら 参照)。
HTTP 1.1以外のプロトコルでの接続のリクエストがあった場合にはステータスコードとして403を返すための設定(詳細はこちら 参照)。
root権限で以下のコマンドを実行し、設定の変更を反映させます。
3rd try: HTTP-01で再度dry run。
root権限で再度以下のコマンドを実行します。
Saving debug log to /var/ log/letsencrypt/ letsencrypt.log
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Processing /etc/ letsencrypt/renewal/ pandanote.info.conf
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator apache, Installer apache
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for pandanote.info
Waiting for verification…
Cleaning up challenges
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
new certificate deployed with reload of apache server; fullchain is
/etc/ letsencrypt/live/ pandanote.info/fullchain.pem
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
** DRY RUN: simulating ‘certbot renew’ close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/ letsencrypt/live/ pandanote.info/fullchain.pem (success)
** DRY RUN: simulating ‘certbot renew’ close to cert expiry
** (The test certificates above have not been saved.)
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Dry runは成功したようです。(`・ω・´)
まとめ
ここまでの作業でLet’s encryptのドメイン認証の方法としてTLS-SNI-01が止まってしまった場合でも、HTTP-01を使ったドメイン認証を行うための準備が整えることが(おそらく)できました。
あとは、本番の作業(2月上旬)を待つのみです。直近の更新は昨年(2018年)の12月上旬に行っているのでちょっと早いのですが、問題発生時の対応のための時間的な余裕が欲しいので、現在使用中の証明書の有効期限まで30日を切ったらできるだけ早めに作業をしようと考えています。
個人的にはTLS-ALPN-01によるドメイン認証に変更したかったのですが、設定作業が大掛かりなものになりそうだったので、今回は断念しました。別の機会に試したいと思います。
この記事は以上ですが、実際に作業した際のメモを続きとしてこちら に書きましたので、ついでにご覧いただけると幸いです。
References / 参考文献