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 も変更します。

  1. 管理画面の「設定」→「一般」で、「WordPress アドレス (URL)」と「サイトアドレス (URL)」を https:// で始まる URL に変えて保存します。
  2. 本文や設定に残っている 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:// に変える。

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲