環境 CentOS Stream release 9 Apache/2.4.57 (CentOS Stream) Xserver VPS
サイト独自の設定ファイルをキー取得用に編集
vi /etc/httpd/conf.d/newsite.conf
<VirtualHost *:80> DocumentRoot /var/www/html/newsite ServerName newsite.com # for Let's Encrypt Alias /.well-known /var/www/html/newsite/.well-known <Directory /var/www/html/newsite> AllowOverride All Require all granted </Directory> </VirtualHost
httpd リスタート
systemctl restart httpd
あとは証明書を取得する
certbotコマンドの実行(DNS登録前提)
certbot certonly \ --server https://acme-v02.api.letsencrypt.org/directory \ --preferred-challenges dns \ -d newsite.com \ -d *.newsite.com \ --agree-tos \ --manual-public-ip-logging-ok \ -m info@newsite.com
上のコマンド実行で newsite.com のみならず、site1.newsite.com や site2.newsite.com 等のサブドメインにも有効な証明書を取得できる。
一つ一つのサイトドメイン毎に証明書を取得するなど七面倒くさいことなどやってられないのでこのコマンド内容さえ覚えておけば事足りる。
Yes/No の問いかけに y Enter で応えて進んでいくと Please deploy a DNS TXT record under the name: と with the following value: が表示される。
これらの値をサイトデータを置いているサーバーの DNS に設定する。
Please deploy a DNS TXT record under the name: _acme-challenge.newsite.com. // サーバーの DNS に設定 with the following value: **************-****************** // TXT の値に設定 Before continuing, verify the TXT record has been deployed. Depending on the DNS provider, this may take some time, from a few seconds to multiple minutes. You can check if it has finished deploying with aid of online tools, such as the Google Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.webrydays.net. Look for one or more bolded line(s) below the line ';ANSWER'. It should show the value(s) you've just added. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue
重要なのは Press Enter to Continue が表示されて Enter キーを押すタイミングで、DNS を設定したからといっても実際に設定内容が反映されるには時間が掛かる。つまり反映された頃合いを見て実行しなければならない。https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.newsite.com でDNS TXT の設定が反映されているか確認しろとあるが、反映されているにも関わらず Enter したらドメインの認証に失敗した旨を示すメッセージが表示され、証明書の取得に失敗したので、たいして役に立たない。
厄介なのは TXT の値はコマンドを実行する度に新しく生成される点で、失敗する度にDNS TXT の値を設定し直さなければならないというループに陥ってしまうことだ。
多少、多めに間を置いてから実行するのが無難。
使用しているターミナルソフトによっては無操作時間に応じて勝手にログオフする機能を無効にするか延長するかの処理が必要かもしれない。それが出来なければ定期的にスクロールするなど、何らかの操作を続ける必要がある。
結局、20分位経ってから Enter で無事、証明書を取得できた。
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/newsite.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/newsite.com/privkey.pem This certificate expires on 2024-11-10. These files will be updated when the certificate renews.
/etc/httpd/conf.d/newsite.conf はそのままで、/etc/httpd/conf.d/ssl.conf を編集する。
ssl.comfの設定
vi /etc/httpd/conf.d/ssl.conf
下記のように加える
# # When we also provide SSL we have to listen to the # standard HTTPS port in addition. # Listen 443 https ## ## SSL Global Context ## ## All SSL configuration in this context applies both to ## the main server and all SSL-enabled virtual hosts. ## # Pass Phrase Dialog: # Configure the pass phrase gathering process. # The filtering dialog program (`builtin' is a internal # terminal dialog) has to provide the pass phrase on stdout. SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog # Inter-Process Session Cache: # Configure the SSL Session Cache: First the mechanism # to use and second the expiring timeout (in seconds). SSLSessionCache shmcb:/run/httpd/sslcache(512000) SSLSessionCacheTimeout 300 # # Use "SSLCryptoDevice" to enable any supported hardware # accelerators. Use "openssl engine -v" to list supported # engine names. NOTE: If you enable an accelerator and the # server does not start, consult the error logs and ensure # your accelerator is functioning properly. # SSLCryptoDevice builtin #SSLCryptoDevice ubsec ## ## SSL Virtual Host Context ## # サイト毎の設定を追記 <VirtualHost *:443> SSLEngine on SSLProtocol All -SSLv2 -SSLv3 -TLSv1 ServerName newsite.com DocumentRoot "/var/www/html/newsite" SSLCertificateFile /etc/letsencrypt/live/newsite.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/newsite.com/privkey.pem <Directory "/var/www/html/newsite"> AllowOverride All Allow from all </Directory> ErrorLog logs/newsite-ssl_error_log CustomLog logs/newsite-ssl_access_log combined </VirtualHost>
サイトごとに80番用の conf ファイルを同じように作成し、443番用はすべて ssl.conf ファイルに追記していく。
httpd リスタート
systemctl restart httpd
https でアクセスできれば成功
証明書の更新を定期実行させる
crontab -e
定期実行コマンドを貼り付ける
0 1 1 * * certbot renew --post-hook systemctl restart httpd
:wq Enter で保存 (上記は毎月1日の 1:00 に証明書を更新させる設定)
実際には有効期限 30 日を切らない限り更新されない。