3ヶ月ほど前に本ブログのサーバを更改の上、https化対応を実施。TLS証明書についてはフリーのLet’s Encryptより発行したが、当該証明書の有効期間は90日である為、先日初回の更新を行った。本記事はその際の作業手順を記載したもの。
前提環境
CentOS 7系、Nginx、Let’s Encryptのクライアントツールはcertbot。既にTLS証明書は導入済み。
Nginxの設定
certbotの–webrootオプション(※)を用いてcertbotクライアント(webサーバ側)と認証局側の認証を行う際、認証局側はhttp://www.example.com/.well-known/acme-challenge/以下のファイルにhttpでアクセス(GETメソッド)を行う。
※webサーバ側のドキュメントルート下に出力される認証用のファイルで認証を行う。
User Guide — Certbot documentation
httpsではなくhttpであり、仮に全てのhttpアクセスを301リダイレクトしている場合は認証が失敗する為、下記の通りNginxの設定を変更する。
server { listen 80; location ^~ /.well-known/acme-challenge/ { default_type "text/plain"; root /xxx/yyy; } location / { return 301 https://$host$request_uri; } }
変更対象ファイルは下記の何れか。私はconf.d/以下にserverディレクティブの設定を記載しているのでNo.2のファイル。
- /etc/nginx/nginx.conf
- /etc/nginx/conf.d/{{filename}}.conf
設定ファイルの修正後、下記コマンドで設定のテスト及び反映。
# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # systemctl reload nginx
念の為、httpで下記のパスへアクセスした際にリダイレクトされない事確認。
また、.well-known/acme-challenge以外のパスへのhttpアクセス時にhttpsアドレスへ301リダイレクトされることを確認する。
TLS証明書の更新
下記コマンドを用いて証明書を更新。
# certbot certonly --webroot -w /xxx/yyy -d example.com -d www.example.com -d mail.example.com --agree-tos --force-renewal -n Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Renewing an existing certificate Performing the following challenges: http-01 challenge for example.com http-01 challenge for mail.example.com http-01 challenge for www.example.com Using the webroot path /xxx/yyy for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2018-12-07. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
その後、改めてNginx設定の更新。
# systemctl reload nginx
最後にブラウザより証明書のnot valid after要素が更新されている事を確認。
因みに、httpアクセスが出来なかった場合はcertbotコマンドで下記のエラーが出力される。
Failed authorization procedure. www.example.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from : "404 Not Found 404 Not Found
", www.example.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from : "
また、次回以降の更新については、下記のcertbot renewコマンドで更新可能。まだ期限まで期間のあるドメインについては、skipされる。(下記の実行例ではexample2.comドメインがスキップされている。)
# certbot renew Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert is due for renewal, auto-renewing... Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Renewing an existing certificate Performing the following challenges: http-01 challenge for mail.example.com http-01 challenge for www.example.com http-01 challenge for example.com Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed without reload, fullchain is /etc/letsencrypt/live/example.com/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com-0001.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert is due for renewal, auto-renewing... Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Renewing an existing certificate Performing the following challenges: http-01 challenge for example.com Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed without reload, fullchain is /etc/letsencrypt/live/example.com-0001/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/www.lundi.jp.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not yet due for renewal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following certs are not due for renewal yet: /etc/letsencrypt/live/www.example2.com/fullchain.pem expires on 2019-02-06 (skipped) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/example.com/fullchain.pem (success) /etc/letsencrypt/live/example.com-0001/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
この証明書をcronで自動更新する設定については下記の記事をご参照。
Nginx: Let’s Encrypt (certbot)のTLS/SSL証明書をcronで定期自動更新する設定