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認証で対応する方法
近々CentOS7系からAlmaLinux8系への移行(サーバも移行)を検討して ...
-
-
CentOS7系にLEMP環境(Linux + Nginx + MySQL + PHP)を構築
先日KAGOYAのVPSからIndigoに移行した際にCentOS6から7へバー ...
-
-
AlmaLinux8.6にLAMP環境&WordPressを構築する方法
だいぶ前にCentOS6系から7系に移行したが、7系も2024/6/30にサポー ...
-
-
OpenLiteSpeedにSSL証明書(Let's Encrypt)を導入しHTTPS接続する方法
昨日Almalinux8系に1-Click InstallでOpenLiteSp ...
-
-
VPSに無料SSLのLet's Encryptを導入
SSLといえば有料という認識だったが、無料のものも出てきているという話を聞いた。 ...