免責事項 #
本記事は、Ubuntu 24 + Apache + WordPress 環境における SSL 証明書(PEM形式)の導入方法について、一般的な手順を解説する技術チュートリアルです。
掲載内容は執筆時点での情報に基づいておりますが、特定の環境・構成・証明書種別・CA仕様・ミドルウェアバージョン等により動作や設定方法が異なる場合があります。
概要 #
本記事は、認証局(CA)の管理画面で発行されたPEM形式のSSL証明書(画面内テキストボックスに表示されるタイプ)を、Ubuntu 24 + Apache + WordPress のサイトへ導入するための一般的なチュートリアルです。
EV/OV/DVいずれの証明書でも、サーバへの導入手順は基本的に同じです。
前提条件 #
- OS:Ubuntu 24(root もしくは sudo 権限あり)
- Web:Apache(
apache2)が稼働している - CMS:WordPress が Apache 配下で稼働している
- 証明書:CAからサーバ証明書(Server Certificate)が発行済み
- 中間証明書:CAから中間証明書(Intermediate / CA Bundle)を入手できる
- 重要:CSRを作ったときの秘密鍵(Private Key)を保持している(紛失している場合は再発行が必要)
CA画面で発行される証明書の形式(添付のような表示) #
CAの管理画面では、以下のようなブロック(PEM)がテキストボックスに表示されることがあります。このブロックを「先頭から末尾まで」コピーしてサーバへ保存します。
-----BEGIN CERTIFICATE-----
(英数字の長い塊)
-----END CERTIFICATE-----
注意
BEGIN/END行を含めてコピーします。- 改行が崩れても動作することはありますが、可能な限り表示どおりに貼り付けるのが安全です。
- 秘密鍵(BEGIN PRIVATE KEY)を貼らないよう注意してください。
導入の全体像 #
- 証明書ファイルを所定の場所へ保存する
- 中間証明書(チェーン)を用意する
- fullchain(サーバ証明書 + 中間)を作る
- 秘密鍵と証明書が一致するか確認する
- ApacheのHTTPS VirtualHostを設定する(80→443リダイレクト含む)
- Apacheをリロードし、WordPressのURL/混在コンテンツを整備する
- 動作確認(チェーン・リダイレクト・証明書情報)
手順1:証明書ファイル配置(サーバ証明書) #
Ubuntuの一般的な配置例です(運用ポリシーに合わせて変更可)。
保存先(例) #
- 秘密鍵(既存):
/etc/ssl/private/example.com.key - サーバ証明書:
/etc/ssl/certs/example.com.crt - 中間証明書:
/etc/ssl/certs/intermediate-ca.pem - fullchain:
/etc/ssl/certs/example.com.fullchain.pem
ディレクトリ作成と権限 #
sudo mkdir -p /etc/ssl/private /etc/ssl/certs
sudo chmod 700 /etc/ssl/private
CA画面の証明書(PEM)をファイルへ保存 #
CA画面のテキストボックスにある証明書ブロックを、/etc/ssl/certs/example.com.crt に貼り付けて保存します。
sudo nano /etc/ssl/certs/example.com.crt
sudo chmod 644 /etc/ssl/certs/example.com.crt
(手元で自動保存したい場合の例:ヒアドキュメント)
sudo tee /etc/ssl/certs/example.com.crt >/dev/null <<'EOF'
-----BEGIN CERTIFICATE-----
(ここに証明書本文を貼り付け)
-----END CERTIFICATE-----
EOF
sudo chmod 644 /etc/ssl/certs/example.com.crt
手順2:中間証明書(CA Bundle / Intermediate)を用意する #
多くのCAでは、サーバ証明書とは別に中間証明書(またはCA Bundle)が提供されます。これが無いと、一部端末で「信頼できない」と表示される原因になります。
中間証明書を保存(例) #
CAから入手した中間証明書(1つまたは複数)を、PEM形式で以下に保存します。
sudo nano /etc/ssl/certs/intermediate-ca.pem
sudo chmod 644 /etc/ssl/certs/intermediate-ca.pem
中間が複数ある場合 #
CA Bundle に複数の中間証明書が含まれる場合は、CAの案内に沿った順序で1ファイルにまとめます(通常は上位へ向かう順)。
手順3:fullchain(サーバ証明書 + 中間)を作成する #
Apacheでは、証明書ファイルとしてfullchain(サーバ証明書+中間)を指定する運用が一般的です。
sudo cat /etc/ssl/certs/example.com.crt \
/etc/ssl/certs/intermediate-ca.pem \
| sudo tee /etc/ssl/certs/example.com.fullchain.pem >/dev/null
sudo chmod 644 /etc/ssl/certs/example.com.fullchain.pem
手順4:秘密鍵と証明書が一致するか確認する(重要) #
証明書と秘密鍵が一致しないと、Apacheを設定してもHTTPSが正常に動作しません。必ず確認します。
確認方法A:RSA鍵の場合(modulus比較) #
openssl x509 -noout -modulus -in /etc/ssl/certs/example.com.crt | openssl md5
openssl rsa -noout -modulus -in /etc/ssl/private/example.com.key | openssl md5
2つのMD5が同じなら一致です。
確認方法B:鍵種別に依存しない(公開鍵SHA256比較) #
# 証明書 → 公開鍵 → SHA256
openssl x509 -in /etc/ssl/certs/example.com.crt -pubkey -noout \
| openssl pkey -pubin -outform DER \
| openssl sha256
# 秘密鍵 → 公開鍵 → SHA256
openssl pkey -in /etc/ssl/private/example.com.key -pubout -outform DER \
| openssl sha256
2つのSHA256が同じなら一致です。
不一致だった場合 #
- 別の秘密鍵でCSRを作った可能性が高いです。
- 正しい秘密鍵が見つからない場合は、CA側で再発行(Reissue)して、正しい鍵でCSRを作り直す必要があります。
手順5:ApacheでHTTPSを有効化する #
必要モジュールを有効化 #
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod rewrite
sudo systemctl reload apache2
ポート443がListenされているか確認 #
通常は /etc/apache2/ports.conf に Listen 443 が入ります。必要に応じて確認してください。
手順6:ApacheのVirtualHost設定(443 + 80→443リダイレクト) #
ここでは例として、example.com 用のサイト設定ファイルを作成して導入します。
サイト設定ファイルを作成(例) #
sudo nano /etc/apache2/sites-available/example.com.conf
設定例(WordPress想定) #
※コード内の example.com や DocumentRoot を実環境に置き換えてください。
<VirtualHost *:80>
ServerName example.com
# HTTP -> HTTPS へ恒久リダイレクト
RewriteEngine On
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example.com/public
# WordPress向け(.htaccess運用の場合)
<Directory /var/www/example.com/public>
AllowOverride All
Require all granted
</Directory>
SSLEngine on
# fullchain(サーバ証明書 + 中間)を指定
SSLCertificateFile /etc/ssl/certs/example.com.fullchain.pem
SSLCertificateKeyFile /etc/ssl/private/example.com.key
# 推奨:必要に応じて有効化(まずは動作確認を優先)
# Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
ErrorLog ${APACHE_LOG_DIR}/example.com-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-ssl-access.log combined
</VirtualHost>
</IfModule>
サイトを有効化 #
sudo a2ensite example.com.conf
設定テスト → リロード #
sudo apache2ctl configtest
sudo systemctl reload apache2
(どのVirtualHostが有効か確認したい場合)
sudo apache2ctl -S
手順7:WordPress側のhttps化 #
サイトURLを https に統一 #
- WordPress管理画面 → 設定 → 一般
- 「WordPress アドレス (URL)」「サイトアドレス (URL)」を
https://example.comに揃える
Mixed Content(混在コンテンツ)対策 #
- 画像やCSS/JSが
http://のままだと、鍵マークが外れる原因になります。 - DB置換、テーマ設定、プラグイン等で
https://に統一してください(作業前バックアップ推奨)。
手順8:動作確認 #
HTTPS疎通(curl) #
curl -I https://example.com/
curl -I http://example.com/
期待値:
https://example.com/が 200/301 など正常応答http://example.com/が 301 で https に誘導
証明書チェーン確認(openssl) #
echo | openssl s_client -connect example.com:443 -servername example.com -showcerts
ブラウザ確認 #
- 証明書エラーが出ないこと
- 証明書詳細で発行先/有効期限/SANなどが想定どおりであること
よくあるトラブルと対処 #
証明書が正しいのに「信頼できない」と出る #
- 中間証明書(CA Bundle)が提供されていない、またはfullchainに含めていない可能性があります。
SSLCertificateFileが fullchain を指しているか確認してください。
Apache起動/リロード時にSSLエラーで落ちる #
- 秘密鍵パスが間違っている、権限が不適切、鍵と証明書が不一致の可能性があります。
- 「手順4」の一致確認を再実施してください。
リダイレクトループになる #
- WordPress側(siteurl/home)とApache側(80→443)が二重で矛盾していることがあります。
- Cloudflare等のCDN/リバプロがある場合、SSLモード設定の影響も受けます。
ロールバック(切り戻し) #
- 導入前に、Apacheのサイト設定ファイルと証明書関連ファイルのバックアップを推奨します。
- 問題が出た場合は、該当サイトを無効化してリロードします。
sudo a2dissite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
運用メモ(更新・再発行) #
- 更新/再発行時の基本:新CSR → CAで再発行/更新 → fullchain差し替え → Apache reload
- 秘密鍵の漏えい疑い:失効(Revoke)→ 新鍵でCSR作成 → 再発行
- 証明書ファイルは改変せず、発行物(PEM)を正確に保存すること