certbot renew --dry-runでエラーとなったときの対処法

Let’s Encryptで証明書更新をするために「certbot renew --dry-run」をしたらエラーなってしまったので、その時の対処法です。証明書の取得は以下のコマンドで実行しています。

# certbot certonly --webroot -w /var/www/html/example -d example.com -d www.example.com

ドキュメントルートは「/var/www/html/example」で、証明書は「example.com」および「www.example.com」に対して取得するという意味です。

# certbot renew --dry-run

をした結果、以下のようなメッセージ(ログ)が表示されました。


# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for example.com
http-01 challenge for www.example.com
Cleaning up challenges
Attempting to renew cert (example.com) from /etc/letsencrypt/renewal/example.com.conf produced an unexpected error: Missing command line flag or config entry for this setting:
Select the webroot for www.example.com:
Choices: ['Enter a new webroot', '/var/www/html/example']

(You can set this with the --webroot-path flag). Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (failure)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (failure)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

[広告]

「/etc/letsencrypt/renewal/example.com.conf」を見ているようなので、中身を確認してみる。


# cat example.com.conf
# renew_before_expiry = 30 days
version = 0.31.0
archive_dir = /etc/letsencrypt/archive/example.com
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = webroot
account = ...
webroot_path = /var/www/html/example,
server = https://acme-v02.api.letsencrypt.org/directory
[[webroot_map]]
example.com = /var/www/html/example

最後の行にある[webroot_map]がexample.comしかないようなので、www.example.comを追加してみる。

[[webroot_map]]
example.com = /var/www/html/example
 ↓
[[webroot_map]]
www.example.com = /var/www/html/example
example.com = /var/www/html/example

再度、「certbot renew --dry-run」を実行。


# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for www.example.com
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Resetting dropped connection: acme-staging-v02.api.letsencrypt.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/example.com/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/example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

うまくいったようです。

Let’s EncryptでSSLサーバ証明書を取得する。

Let’s Encryptを利用してSSLサーバー証明書を取得しました。取得した際の環境は以下です。

CentOS 7.4 + Apache 2.4.6

なお、Apacheにはバーチャルホストが設定してあって、SSLサーバー証明書の取得の作業はrootユーザで行います。

1. firewalldの停止

証明書取得の際、Let’s Encryptのサーバーと通信を行うためfirewalldは停止しておきます。80番ポート、443番ポートを通過させる設定になっていればfirewalldの停止は不要です。

firewalldの停止
# systemctl stop firewalld

firewalldの停止の確認
# systemctl is-active firewalld

「unknown」と表示されれば停止してます。起動している場合は「active」と表示されます。

2. mod_sslのインストール

/etc/httpd/conf.d 配下にssl.confがないことを確認します(あったらすでにmod_sslはインストール済みです)。

mod_sslのインストール
# yum install mod_ssl

インストールが完了すると、以下の2ファイルができます。

/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.modules.d/00-ssl.conf

mod_sslを有効にするためApacheを再起動します。

Apacheの再起動
# systemctl restart httpd

Apacheの起動の確認
# systemctl is-active httpd

「active」と表示されていることを確認します。

[広告]

3. certbotのインストール

Let’s EncryptでSSLサーバー証明書を取得してくるプログラムは「certbot」です。これをインストールします。certbotはepelリポジトリにあるため、まずepelリポジトリのインストールを行います。

epelリポジトリのインストール
# yum install epel-release

epelリポジトリのインストールができたら、certbot本体とcertbot用のApacheのプラグインをインストールします。ここで、プラグインのほうが以下の2種類があるようで、どちらのものが使用されるのか先に確認を行います。

certbot用のApacheのプラグイン
・python-certbot-apache
・python2-certbot-apache

どちらのプラグインが使用されるのか確認する。
# yum search certbot

以下が実行したときのログです。赤線部分を見ることでどちらかわかります。

僕の環境ではpython2-certbot-apacheが使われるようなので、これとcertbot本体をインストールします。

certbot本体のインストール
# yum install certbot

プラグインのインストール
# yum install python2-certbot-apache

念の為、インストールの結果を確認しておきます。

インストール後の確認
# yum list installed | grep certbot

僕の環境では、以下のようになりました。

certbotのインストール先を見ておきます。

配置先の確認
# which certbot

/bin 配下に置かれているようです。

[広告]

4. SSLサーバー証明書の発行

SSLサーバー証明書の発行は以下のコマンドで実行します。

SSLサーバー証明書の発行
# certbot certonly --webroot -w /var/www/html/example -d example.com -d www.example.com

コマンドの説明をしておくと「/var/www/html/example」はドキュメントルートになりますので自分の環境に合わせて書き換えてください。また「-d」オプションですが証明書を取得するドメイン名を指定します。上記の例だと「example.com」および「www.example.com」の2つに対して証明書を取得するようにしています。ドメイン名についても自分のドメインにあわせて書き換えてください。

なお、certbotコマンドを実行する前にドメインの名前解決ができるようにしておいてください(DNSで名前解決できるようにしておく)。それをしておかないとcertbot実行時にエラーになってしまいますので。

certbotコマンドを実行すると以下の質問を受けますので、内容を確認して入力をしてください。

①連作先のEmailアドレスを入力します。
②規約に同意するかどうかを選びます。「A」は同意です。
③Let’s EncryptパートナーにEmailアドレスを公開するかどうかを選びます。

証明書の発行が問題なくできれば、以下のメッセージが表示されます。

CentOS 6 の場合だと、Let’s Encryptがhttpd.confやssl.confの書き換えを行って options-ssl-apache.conf を自動生成したりするのですが、CentOS 7 の場合だとhttpd.confやssl.confの書き換えはまったく行われていませんでした。options-ssl-apache.conf もありませんでした。

SSLサーバー証明書ですが、以下の場所にできています。

SSLサーバー証明書の格納先(シンボリックリンク)
/etc/letsencrypt/live/example.com

「example.com」はドメイン名なので自分の環境に合わせて読み替えてください。なお、ここにできているものはシンボリックリンクで実体は別の場所(以下)となります。

SSLサーバー証明書の実体
/etc/letsencrypt/archive/example.com

この証明書の場所をssl.confに記載しておくのですが必要なものは以下となります。fullchain.pemは使いません。

サーバ証明書(公開鍵)
SSLCertificateFile・・・/etc/letsencrypt/live/ドメイン名/cert.pem

秘密鍵
SSLCertificateKeyFile・・・/etc/letsencrypt/live/ドメイン名/privkey.pem

中間証明書
SSLCertificateChainFile・・・/etc/letsencrypt/live/ドメイン名/chain.pem

[広告]

5. ssl.conf、httpd.confの修正

ssl.confの書き換えを行います。すでに80番ポートでバーチャルホストを設定していたものとして、ssl.confの修正内容は以下となります。「example」の部分は自分の環境に合わせて書き換えてください。

①VirtualHostタグの修正
<VirtualHost _default_:443>
 ↓
<VirtualHost *:443>

②ドキュメントルートの追加
DocumentRoot “/var/www/html/example”

③ServerNameの追加
ServerName www.example.com:443

④証明書のパスの追加
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

①〜④を反映させたssl.confの内容

また、80番ポートにアクセスしてきた場合に443番ポートにリダイレクトさせる設定もしておきます。こちらはhttpd.confのVirtualHostタグに以下の情報を追加します。

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,NE,R=permanent]

リダイレクトを反映させたhttpd.confの内容

これで設定は終わりです。Apacheを再起動します。

Apacheの再起動
# systemctl restart httpd

ブラウザでアクセスしてみてください。URLの欄に鍵マークが表示されます。