CentOS

>

certbot ワイルドカード証明書の取得

公開日 : 2024/08/18

最終更新日時 : 2024/12/30 14:31:01

環境
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 日を切らない限り更新されない。