もともと python3-certbot-apache で設定していたのを、ワイルドカード証明書に変更したときの記録。
certbotのインストールと昔の設定
コマンド履歴をみるとこんな感じだったらしい。
sudo apt install certbot python3-certbot-apache
sudo certbot --apache
sudo certbot renew --dry-run
certbotでワイルドカード証明書を取得
Let's Encryptでワイルドカード証明書を取得する | クラウドのエスエスアイ・ラボ を参考に
sudo certbot certonly \
--manual \
--cert-name fuktommy.com \
--preferred-challenges dns \
-d "*.fuktommy.com" \
-d fuktommy.com \
-m webmaster@fuktommy.com \
--agree-tos \
--manual-public-ip-logging-ok
自己署名証明書を生成
vhostsのデフォルト設定ではどうせドメイン名とか適当なので、自己署名証明書を使う。 OpenSSL で SSL 自己証明書を発行する手順 | と apache 2.4系 SSL自己証明書の導入方法 | Check!Site を参考に
sudo mkdir -p /etc/cert/self-signed
cd /etc/cert/self-signed
sudo openssl req -subj "/C=JP/ST=Tokyo" -x509 -nodes -new -keyout server.key -out server.crt -days 3650
Apacheのvhostsのデフォルト設定
IPアドレス指定とかそういうのを食います。
ServerName example.com
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName example.com
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
DocumentRoot /var/www/html
<Directory /var/www>
略
</Directory>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName example.com
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
DocumentRoot /var/www/html
<Directory /var/www>
略
</Directory>
SSLCertificateFile /etc/cert/self-signed/server.crt
SSLCertificateKeyFile /etc/cert/self-signed/server.key
</VirtualHost>
</IfModule>
実際に使うvhostの設定
この設定を必要なだけ並べます。 python3-certbot-apache が生成したファイルをベースにしています。
<VirtualHost *:80>
ServerAdmin webmaster@fuktommy.com
ServerName twf.fuktommy.com
ErrorLog /var/log/apache2/twf.fuktommy.com.error.log
CustomLog /var/log/apache2/twf.fuktommy.com.access.log combined
DocumentRoot /var/www/html
RewriteEngine on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@fuktommy.com
ServerName twf.fuktommy.com
ErrorLog /var/log/apache2/twf.fuktommy.com.error.log
CustomLog /var/log/apache2/twf.fuktommy.com.access.log combined
DocumentRoot /srv/www/html
<Directory /var/www>
略
</Directory>
SSLCertificateFile /etc/letsencrypt/live/fuktommy.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/fuktommy.com/privkey.pem
</VirtualHost>
</IfModule>
ワイルドカードのvhostの設定
この設定は最後に位置するようにします。 apache - Virtualhost For Wildcard Subdomain and Static Subdomain - Stack Overflow を参考にしました。
<VirtualHost *:80>
ServerAdmin webmaster@fuktommy.com
ServerName default.fuktommy.com
ServerAlias *.fuktommy.com
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
DocumentRoot /var/www/html
RewriteEngine on
RewriteCond %{HTTP_HOST} tumblr.fuktommy\.com$
RewriteRule .(.*) https://fuktommy.tumblr.com/$1 [L]
RewriteRule ^ https://fuktommy.com/ [L]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@fuktommy.com
ServerName default.fuktommy.com
ServerAlias *.fuktommy.com
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
DocumentRoot /var/www/html
RewriteEngine on
RewriteCond %{HTTP_HOST} tumblr.fuktommy\.com$
RewriteRule .(.*) https://fuktommy.tumblr.com/$1 [L]
RewriteRule ^ https://fuktommy.com/ [L]
SSLCertificateFile /etc/letsencrypt/live/fuktommy.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/fuktommy.com/privkey.pem
</VirtualHost>
</IfModule>
ウチの場合は shingetsu.info も持ってるので、ワイルドカードの設定は2セットあります。
options-ssl-apache.conf を消す
Let's EncryptのSSL証明書の新しいサーバーへの引っ越し作業 - Ubuntu開発環境構築 - Perl Web開発環境構築を見ると要らなさそうなので消します。 もともと ssl.conf もありますしね。
dovecotの設定
もともとpop3を使ってたのですが 【Postfix+Dovecot+SSL】2019年の終わりにあえてメールサーバーを構築する | 感情的プログラミング伝記 | タウン情報誌 AIR函館 - 北海道函館市の食・呑・遊をご紹介! をみてpop3sに変更しました。 書き換えたのはこの辺かな
ssl = required
ssl_cert = </etc/letsencrypt/live/fuktommy.com/fullchain.pem
ssl_cert_key = </etc/letsencrypt/live/fuktommy.com/privkey.pem
inet_listener pop3s {
port = 995
ssl = yes
}
certbot-dns-sakuracloud の設定
よく考えたら手動で証明書取得してるから証明書の更新ができないんですよね。 さくらのドメインでとったドメインを certbot の dns-01 に対応させた | cexenのIT備忘録 や さくらのクラウドDNS + Let's Encrypt でワイルドカード証明書する! - Qiita を参考に certbot-dns-sakuracloud を導入します。 あとエラーが出たので certbot-dns-sakuracloudを利用したLet's Encrypt証明書更新に失敗する場合の原因と対応方法 - Qiita も見ました。 次回があれば証明書の取得からこのプラグインを作りたいところ。 自動更新の設定はこんな感じ。
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --dns-sakuracloud --dns-sakuracloud-credentials /etc/cert/sakura-apikey