福冨諭の福冨論

RSSリーダーではこちらをどうぞ→https://feeds.feedburner.com/fuktommy

Let's Encrypt でワイルドカード証明書の設定をした

もともと 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