勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法

先日Podmanで作成したApache用コンテナに対してドメインを割り当てたが、さらにLet's Encryptを導入しHTTPS接続できるようにしたい。また、wwwあり無しのどちらのパターンでもHTTPS接続可としたい。以下に対応方法をメモ。

 

やりたいこと

  • Apache用コンテナに「test.com」「www.test.com」を割り当てており、こちらにHTTPS接続できるようにしたい
  • SSL証明書はホスト(VPS)側に導入
  • 自動更新設定はCrontabではなくsystemd timerで対応

 

環境について

VPS

今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。

  • 接続ポート -> 22
  • ユーザ名 -> root
  • パスワード or 秘密鍵 -> インスタンス作成時に選択したもの

ホスト(VPS)側 AlmaLinux / Apache

詳細なバージョンは以下の通り。

# AlmaLinuxのバージョン確認
cat /etc/redhat-release

# 実行結果
AlmaLinux release 8.10 (Cerulean Leopard)

# Apacheのバージョン確認
httpd -v

# 実行結果
Server version: Apache/2.4.37 (AlmaLinux)

 

対応方法

ファイアウォール設定

サーバにSSH接続し以下コマンドでhttps用(443番)ポートを開放する。既に解放済みの場合は不要。

# https用のポート開放
firewall-cmd --permanent --add-service=https

# 設定の反映
firewall-cmd --reload

# 設定確認
firewall-cmd --list-all

設定確認の際はserviceの欄にhttpsが表示されていればOK。

Certbotのインストールと各種設定

引き続き以下コマンドを実行。

# epelリポジトリの有効化
dnf install epel-release

# CertbotとApache用プラグインのインストール
dnf install certbot python3-certbot-apache

# SSL証明書発行及びApacheの自動設定(ドメイン部分は適宜変更)
certbot --apache -d test.com -d www.test.com

すると連絡用メールアドレスが聞かれるのでメールアドレスを入力の上、エンターキーを押下(コメント部分は翻訳)。

# デバッグログを /var/log/letsencrypt/letsencrypt.log 
# に保存するメールアドレスを入力してください(緊急更新およびセキュリティ通知に使用)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel):

次は利用規約に関するメッセージが表示されるので「Y」を入力の上、エンターキーを押下。

# 利用規約をお読みください。 
# https://letsencrypt.org/documents/LE-SA-v1.8-July-06-2026.pdf。
# あなたは同意しなければなりません 
# ACMEサーバーに登録するよう命じる。あなたは同意しますか?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.8-July-06-2026.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

次はメールマガジンに関するメッセージが表示されるので「Y」もしくは「N」を入力の上、エンターキーを押下。私は「N」にしておいた。

# 最初の証明書が無事に発行された後、創設団体である電子フロンティア財団にメールアドレスを共有してください 
# Let's Encryptプロジェクトのパートナーであり、非営利団体であるCertbotを開発しているのですか?
# ウェブ暗号化に関する私たちの取り組みについてメールをお送りしたいと思います。
# EFFのニュース、キャンペーン、そしてデジタルの自由を支援する方法。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

ここまでで問題無ければ以下メッセージが表示され、Certbotのインストールと各種設定が完了。

Account registered.
Requesting a certificate for test.com and www.test.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/test.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/test.com/privkey.pem
This certificate expires on 2026-xx-xx.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for test.com to /etc/httpd/conf.d/podman-proxy-le-ssl.conf
Successfully deployed certificate for www.test.com to /etc/httpd/conf.d/podman-proxy-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://test.com and https://www.test.com

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

念のため以下が翻訳した内容になる。

アカウントが登録されました。
test.com および www.test.com 用の証明書をリクエスト中

証明書の取得に成功しました。
証明書の保存場所: /etc/letsencrypt/live/test.com/fullchain.pem
鍵の保存場所:         /etc/letsencrypt/live/test.com/privkey.pem
この証明書の有効期限は 2026-xx-xx です。
これらのファイルは、証明書の更新時に更新されます。
Certbot は、バックグラウンドでこの証明書を自動的に更新するスケジュールタスクを設定しました。

証明書をデプロイ中
test.com 用の証明書を /etc/httpd/conf.d/podman-proxy-le-ssl.conf に正常にデプロイしました
www.test.com 用の証明書を /etc/httpd/conf.d/podman-proxy-le-ssl.conf に正常にデプロイしました
おめでとうございます! https://test.com および https://www.test.com で HTTPS を正常に有効化できました。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Certbot を気に入っていただけた場合は、以下の方法での活動支援をご検討ください:
 * ISRG / Let's Encrypt への寄付:   https://letsencrypt.org/donate
 * EFF への寄付:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

以下コマンドでApacheを再起動する。

systemctl restart httpd

この時点でブラウザからHTTPS接続ができるようになっている筈。

バーチャルホスト関連の設定ファイルについて

ちなみにCertbotインストール完了時のメッセージにあるように「/etc/httpd/conf.d/podman-proxy-le-ssl.conf」というHTTPS接続用のバーチャルホストに関する設定ファイルが作成される。

内容は以下の通りでCertbotインストール時に指定したドメインに対し、HTTPS接続ができるようにするといった内容(コメントは後でわかりやすいように追記したもの)。

<IfModule mod_ssl.c>
    # HTTPS(443番ポート)接続があった場合
    <VirtualHost *:443>
        # test.comにアクセスがあった場合
        ServerName test.com

        # www付でアクセスがあった場合
        ServerAlias www.test.com

        # リバースプロキシをONにし8080ポートに転送
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:8080/
        ProxyPassReverse / http://127.0.0.1:8080/

        # エラーログとカスタムログ設定
        ErrorLog logs/container-error.log
        CustomLog logs/container-access.log combined

        # 証明書ファイル・キーの保存場所
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/test.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/test.com/privkey.pem
    </VirtualHost>
</IfModule>

また、私の環境だとドメイン割り当ての際に作成した/etc/httpd/conf.d/podman-proxy.conf」にも設定が追記されていた。

内容としては以下の通りで指定したドメインにHTTP接続があればHTTPS接続にリダイレクトするといった内容。

# --------------------------------------------------
# ホスト(VPS)側設定
# --------------------------------------------------
# IPアドレスでの接続を拒否するための設定
# HTTP(80番ポート)接続
<VirtualHost *:80>

    # どのServerNameにも一致しない場合はアクセス拒否
    <Location />
        Require all denied
    </Location>
    ErrorLog logs/host-error.log
    CustomLog logs/host-access.log combined
</VirtualHost>

# --------------------------------------------------
# コンテナ側設定
# --------------------------------------------------
<VirtualHost *:80>

    # test.comにアクセスがあった場合
    ServerName test.com

    # www付でアクセスがあった場合
    ServerAlias www.test.com

    # リバースプロキシをONにし8080ポートに転送
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    # エラーログとカスタムログ設定
    ErrorLog logs/container-error.log
    CustomLog logs/container-access.log combined

    ##### 以降が追記された内容 #####
    RewriteEngine on
    
    # リクエストされたサーバー名がtest.comまたはwww.test.comの場合
    RewriteCond %{SERVER_NAME} =test.com [OR]
    RewriteCond %{SERVER_NAME} =www.test.com

    # URLパスやクエリパラメータを維持したままHTTPS接続に301(永続的な)リダイレクト。
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

タイマー(systemd timer)設定

引き続き以下コマンドを実行。

# タイマーの有効化と起動
systemctl enable --now certbot-renew.timer

# タイマーが正しくセットされているか確認
systemctl status certbot-renew.timer

以下のようにActive欄がactiveになっていればOK。タイマーは有効でTrigger欄の日時に自動更新スクリプトが実行される予定となる。

 Active: active (waiting) since Thu 2026-xx-xx xx:xx:xx JST; 19h ago
 Trigger: Fri 2026-xx-xx xx:xx:xx JST; 6h left

自動更新のテスト

以下コマンドで自動更新が正しく動作するかテストする。

# 自動更新が正しく動作するかテスト
certbot renew --dry-run

以下のように「Congratulations, all simulated renewals succeeded(おめでとうございます。すべてのシミュレーション更新が成功しました)」と表示されればOK。

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/test.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for test.com and www.test.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/test.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IPアドレスへのHTTPS接続を拒否する方法

先日メモした方法でIPアドレスへのHTTP接続は拒否できているがHTTPS接続はできる状態のため、こちらも拒否したい。そのため「/etc/httpd/conf.d/podman-proxy-le-ssl.conf」にホスト側設定を追記する。具体的には以下の通り。

# --------------------------------------------------
# ホスト(VPS)側設定
# --------------------------------------------------
# IPアドレスでのHTTPS接続を拒否するための設定
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        # どのServerNameにも一致しない場合はアクセス拒否
        <Location />
            Require all denied
        </Location>

        # 証明書ファイル・キーの保存場所(本番用を使いまわす)
        SSLCertificateFile /etc/letsencrypt/live/test.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/test.com/privkey.pem

        ErrorLog logs/host-ssl-reject-error.log
        CustomLog logs/host-ssl-reject-access.log combined
    </VirtualHost>
</IfModule>

# --------------------------------------------------
# コンテナ側設定
# --------------------------------------------------
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        # test.comにアクセスがあった場合
        ServerName test.com

        # www付でアクセスがあった場合
        ServerAlias www.test.com

        # リバースプロキシをONにし8080ポートに転送
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:8080/
        ProxyPassReverse / http://127.0.0.1:8080/

        # エラーログとカスタムログ設定
        ErrorLog logs/container-ssl-error.log
        CustomLog logs/container-ssl-access.log combined

        # 証明書ファイル・キーの保存場所
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/test.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/test.com/privkey.pem
    </VirtualHost>
</IfModule>

設定ファイルの構文チェックを行い、問題無ければApacheを再起動する。

# 構文チェック
httpd -t

# 以下が表示さればOK
Syntax OK

# Apacheの再起動
systemctl restart httpd

 - サーバー

  関連記事

サーバ移行の際にLet’s EncryptをDNS認証で対応する方法
サーバ移行の際にLet’s EncryptをDNS認証で対応する方法

近々CentOS7系からAlmaLinux8系への移行(サーバも移行)を検討して ...

CentOS7系にLEMP環境(Linux + Nginx + MySQL + PHP)を構築
CentOS7系にLEMP環境(Linux + Nginx + MySQL + PHP)を構築

先日KAGOYAのVPSからIndigoに移行した際にCentOS6から7へバー ...

AlmaLinux8.6にLAMP環境&WordPressを構築する方法
AlmaLinux8.6にLAMP環境&WordPressを構築する方法

だいぶ前にCentOS6系から7系に移行したが、7系も2024/6/30にサポー ...

OpenLiteSpeedにSSL証明書(Let's Encrypt)を導入しHTTPS接続する方法
OpenLiteSpeedにSSL証明書(Let's Encrypt)を導入しHTTPS接続する方法

昨日Almalinux8系に1-Click InstallでOpenLiteSp ...

VPSに無料SSLのLet's Encryptを導入
VPSに無料SSLのLet's Encryptを導入

SSLといえば有料という認識だったが、無料のものも出てきているという話を聞いた。 ...