2026年5月19日
2026年5月19日
ApacheでSSL/TLS(HTTPS)を有効にする手順:Let’s EncryptとCertbotで証明書を設定
Apache HTTP Server で HTTPS を使うには、サーバー証明書を用意し、mod_ssl を有効にして、443番ポートの VirtualHost に証明書を設定します。証明書は無料の Let's Encrypt を使い、取得と更新には Let's Encrypt が勧めるクライアントの Certbot を使うのが一般的です。
以前は letsencrypt という名前のパッケージとコマンドで取得する手順が紹介されていましたが、これは Certbot の旧名で、現在は certbot パッケージと certbot コマンドを使います。この記事では、Ubuntu / Debian の Apache 2.4 を例に、Certbot での証明書の取得から、Apache の設定、自動更新の確認、WordPress 側の設定変更までを説明します。RHEL 系(AlmaLinux・Rocky Linux など)での違いは後の節にまとめています。
前提と準備
作業の前に、次の状態になっていることを確認します。
- ドメイン(例:
example.comとwww.example.com)の A / AAAA レコードが、このサーバーの IP アドレスを指している - 80番と443番ポートが外部から届く(Let's Encrypt の確認は80番で行われます)
- HTTP(80番)でサイトが表示でき、その VirtualHost に
ServerNameが書かれている
ファイアウォールに ufw を使っている場合は、Apache の80番と443番を開けます。
sudo ufw allow 'Apache Full'
80番の VirtualHost の例です。/etc/apache2/sites-available/example.com.conf に置き、sudo a2ensite example.com.conf で有効にしておきます。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example
<Directory /var/www/example>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example-error.log
CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>
AllowOverride All は WordPress の .htaccess(パーマリンク)を使うための設定です。WordPress を置かない場合は不要です。
Certbot をインストールする
Ubuntu / Debian では、Certbot 本体と Apache 用プラグインをパッケージで入れられます。
sudo apt update
sudo apt install certbot python3-certbot-apache
Certbot の公式サイトでは snap での導入も案内されています。どちらか一方だけを使い、両方を入れないようにしてください。
方法A: Certbot に Apache の設定まで任せる
いちばん手早いのは、Apache プラグイン(--apache)で証明書の取得と Apache の設定をまとめて行う方法です。
sudo certbot --apache -d example.com -d www.example.com
初回はメールアドレスの入力と利用規約への同意を求められます。Certbot は80番の VirtualHost の ServerName / ServerAlias から対象を探し、次のことを行います。
- 証明書を
/etc/letsencrypt/live/example.com/に保存する - 443番用の VirtualHost(例:
/etc/apache2/sites-available/example.com-le-ssl.conf)を作り、mod_sslを有効にする - HTTP から HTTPS へのリダイレクトを設定する(最近の Certbot では既定で設定されます)
終わったら、ブラウザで https://example.com/ を開いて確認します。設定を自分で管理したい場合は、次の方法Bを使います。
方法B: 証明書だけ取得して、Apache は手で設定する
証明書を取得する
certonly と --webroot を使うと、Apache の設定には触れずに証明書だけを取得します。-w には、80番の VirtualHost の DocumentRoot を指定します。
sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com \
--deploy-hook "systemctl reload apache2"
--deploy-hook は、証明書を更新できたときに実行するコマンドです。この指定は更新用の設定ファイル(/etc/letsencrypt/renewal/example.com.conf)に保存されるので、自動更新のたびに Apache が新しい証明書を読み込みます。
取得できると、次のファイルができます。
| ファイル | 中身 |
|---|---|
/etc/letsencrypt/live/example.com/fullchain.pem |
サーバー証明書と中間証明書 |
/etc/letsencrypt/live/example.com/privkey.pem |
秘密鍵 |
mod_ssl を有効にする
sudo a2enmod ssl
443番の VirtualHost を作る
/etc/apache2/sites-available/example.com-ssl.conf を作ります。
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
<Directory /var/www/example>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/example-ssl-access.log combined
</VirtualHost>
Apache 2.4.8 以降では、SSLCertificateFile に中間証明書を含む fullchain.pem を指定すれば、SSLCertificateChainFile は不要です。中間証明書が欠けると、一部のブラウザや curl で証明書エラーになります。
有効にして、構文を確かめてから読み込み直します。
sudo a2ensite example.com-ssl.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
apache2ctl configtest が Syntax OK を返さないときは、表示された行を直してから読み込み直します。
HTTP から HTTPS へリダイレクトする
80番の VirtualHost を、HTTPS へ転送するだけの設定に置き換えます。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
この設定でも証明書の更新は続けられます。Let's Encrypt の確認用アクセス(/.well-known/acme-challenge/)は HTTPS 側に転送され、443番の DocumentRoot が -w で指定したディレクトリと同じなら、そこで応答できるためです。DocumentRoot を変えたときは、/etc/letsencrypt/renewal/example.com.conf の webroot の指定も合わせて変えます。
TLS のバージョンを指定する
古い TLS 1.0 / 1.1 は主要なブラウザで使えなくなっています。サーバー全体の設定(Ubuntu / Debian では /etc/apache2/mods-available/ssl.conf)で、TLS 1.2 と 1.3 だけを許可しておきます。
SSLProtocol -all +TLSv1.2 +TLSv1.3
暗号スイートなどの細かな推奨値は、Mozilla の「SSL Configuration Generator」でサーバーと OpenSSL のバージョンを指定すると確認できます。変更後は sudo apache2ctl configtest と sudo systemctl reload apache2 を実行します。
自動更新を確認する
Let's Encrypt の証明書の有効期間は、2026年10月時点で90日です。Let's Encrypt は有効期間を段階的に短くすると発表しており、既定の証明書は2027年2月から64日、2028年2月から45日になる予定です。手作業での更新は現実的でなくなるので、自動更新が動いていることを確かめておきます。
# 更新用のタイマーが登録されているか
systemctl list-timers | grep certbot
# 実際には更新せずに、更新の手順が通るかを試す
sudo certbot renew --dry-run
# 取得済みの証明書と有効期限の一覧
sudo certbot certificates
apt で入れた Certbot は certbot.timer、snap で入れた場合は snap.certbot.renew.timer で、1日2回更新の要否を確認します。--dry-run が失敗する場合は、80番ポートが閉じていないか、DNS が変わっていないか、webroot のパスが合っているかを確認します。
Let's Encrypt は2025年に有効期限切れの通知メールの送信を終えているので、期限の監視は自分で用意しておくと安心です。
WordPress 側の設定を HTTPS に切り替える
サーバーが HTTPS で応答するようになったら、WordPress のサイトの URL も変更します。
- 管理画面の「設定」→「一般」で、「WordPress アドレス (URL)」と「サイトアドレス (URL)」を
https://で始まる URL に変えて保存します。 - 本文や設定に残っている
http://の URL を置き換えます。WP-CLI が使えるなら、まず--dry-runで件数を確認してから実行します。
wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid --dry-run
wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid
作業前にデータベースのバックアップを取ってください。画像やスクリプトが http:// のまま読み込まれていると、ブラウザが「混在コンテンツ」として警告やブロックをします。
動作を確認する
# 応答のヘッダーを確認する
curl -I https://example.com/
# HTTP からリダイレクトされるか
curl -I http://example.com/
# 証明書の発行先と有効期限を確認する
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
ブラウザでも https://example.com/ と https://www.example.com/ を開き、証明書のエラーが出ないことを確認します。
RHEL 系(AlmaLinux・Rocky Linux)での違い
| 項目 | Ubuntu / Debian | RHEL 系 |
|---|---|---|
| SSL モジュール | sudo a2enmod ssl |
sudo dnf install mod_ssl |
| 設定ファイル | /etc/apache2/sites-available/ |
/etc/httpd/conf.d/*.conf |
| Certbot | apt install certbot python3-certbot-apache |
EPEL を有効にして dnf install certbot python3-certbot-apache |
| サービス名 | apache2 |
httpd |
| 構文確認 | apache2ctl configtest |
apachectl configtest |
| ファイアウォール | ufw allow 'Apache Full' |
firewall-cmd --permanent --add-service=https のあと firewall-cmd --reload |
RHEL 系で EPEL の Certbot を使う場合、更新用のタイマー(certbot-renew.timer)は自動では有効にならないことがあります。sudo systemctl enable --now certbot-renew.timer で有効にし、systemctl list-timers で確認してください。--deploy-hook の再読み込みコマンドも systemctl reload httpd にします。
よくあるつまずき
- 証明書の取得で失敗する: DNS がまだ別のサーバーを指している、80番が閉じている、Cloudflare などのプロキシを経由していて確認用のアクセスが届かない、などが原因です。エラーに出る URL を外部から開けるか確かめます。
SSLEngineで Apache が起動しない:mod_sslが有効になっていません。sudo a2enmod sslを実行します。- HTTPS で別のサイトが表示される: 443番の VirtualHost の
ServerName/ServerAliasが合っていないか、サイトが有効になっていません。sudo apache2ctl -Sで、どの VirtualHost がどの名前を受けているかを確認します。 - リダイレクトが繰り返される:
.htaccessや WordPress のプラグインでも HTTPS への転送をしていると、二重になってループすることがあります。転送はどちらか一か所にまとめます。
まとめ
- 証明書の取得には、旧名の
letsencryptではなくcertbotを使う。 - 手早く済ませるなら
certbot --apache、設定を自分で管理するならcertbot certonly --webrootと443番の VirtualHost を書く。 SSLCertificateFileにはfullchain.pem、SSLCertificateKeyFileにはprivkey.pemを指定する。- TLS は 1.2 と 1.3 だけを許可し、HTTP は HTTPS へ恒久的に転送する。
certbot renew --dry-runとタイマーで自動更新を確認し、WordPress の URL もhttps://に変える。