Ubuntu 22.04 の Apache で TLS を有効化する場合、作業の中心は証明書ファイルを置くことではなく、TLS 用の VirtualHost を正しく作ることです。証明書、秘密鍵、ServerName、Apache モジュール、サイト有効化、検証までを一連の流れとして扱います。
この記事では、内部 CA や自己署名 CA で発行した証明書を使い、Apache の HTTPS VirtualHost を構成する手順を整理します。公開サイトであれば Let’s Encrypt などの公開 CA を使う方が自然ですが、内部向け Web UI や検証環境では内部 CA の証明書を使う場面もあります。
Apache HTTP Server ポケットリファレンス
Apache HTTP Server の設定、ディレクティブ、モジュール、運用項目を確認したい場合の参考書籍です。古い 2.0 / 2.2 系対応書籍のため、価格や在庫、現在の Apache 2.4 との差分はリンク先や公式ドキュメントで確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
関連する記事
Apache TLS は、証明書作成、CA 信頼、Apache 基本設定、HTTP/2、PHP、WAF とつながる記事です。必要な前提に応じて参照してください。
- Ubuntu 22.04 Apache Web サーバー構築 基本的な Web サーバー
- Ubuntu 22.04 easy-rsa – 内部 CA と SAN 付き自己署名証明書を作成する
- Ubuntu 22.04 update-ca-certificates – 内部 CA と自己署名証明書を信頼する
- Ubuntu 22.04 Apache Web サーバー構築 HTTP/2 有効化
- Ubuntu 22.04 Apache Web サーバー構築 PHP 有効化
- Ubuntu 22.04 Apache Web サーバー構築 WAF 有効化
Apache TLS で確認するもの
TLS 有効化では、証明書ファイルだけでなく、秘密鍵の権限、VirtualHost、ServerName、証明書の SAN、クライアント側の CA 信頼を合わせて確認します。
| 項目 | 役割 |
|---|---|
| SSLCertificateFile | Apache が提示するサーバー証明書 |
| SSLCertificateKeyFile | サーバー証明書に対応する秘密鍵 |
| ServerName | VirtualHost の代表名。証明書の SAN と合わせる |
| a2enmod ssl | Apache の SSL/TLS モジュールを有効化する |
| a2ensite | TLS 用 VirtualHost を有効化する |
| クライアント側 CA 信頼 | 内部 CA 証明書を信頼して証明書検証を通す |
証明書と秘密鍵を配置する
ここでは、easy-rsa などで作成した内部 CA 発行の証明書を使う例にします。秘密鍵は誰でも読める状態にせず、Apache が起動時に読める範囲へ絞ります。
sudo install -d -m 0750 -o root -g ssl-cert /etc/ssl/local
sudo install -m 0644 server.example.local.crt /etc/ssl/local/server.example.local.crt
sudo install -m 0640 -o root -g ssl-cert server.example.local.key /etc/ssl/local/server.example.local.key
sudo install -m 0644 internal-ca.crt /etc/ssl/local/internal-ca.crtApache が秘密鍵を読めない場合、設定ファイルが正しくても起動に失敗します。一方で、秘密鍵を 0644 のように広く読める権限にするのは避けます。
SSL モジュールを有効化する
Apache の SSL/TLS 機能を有効化します。
sudo a2enmod ssl
sudo systemctl reload apache2TLS 用 VirtualHost を作成する
既存の default-ssl.conf を直接使っても構いませんが、運用上はサイトごとに VirtualHost ファイルを分ける方が見通しがよくなります。ここでは server.example.local 用の設定を作ります。
sudo tee /etc/apache2/sites-available/server.example.local-ssl.conf <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName server.example.local
ServerAdmin webmaster@example.local
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/local/server.example.local.crt
SSLCertificateKeyFile /etc/ssl/local/server.example.local.key
ErrorLog ${APACHE_LOG_DIR}/server.example.local-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/server.example.local-ssl-access.log combined
</VirtualHost>
</IfModule>
EOF内部 CA の証明書を使う場合でも、Apache 側で CA 証明書を信頼させるというより、Apache はサーバー証明書と秘密鍵を提示します。クライアント側がその発行元 CA を信頼しているかが検証のポイントです。
サイトを有効化する
TLS 用 VirtualHost を有効化し、設定構文を確認してから Apache を再読み込みします。
sudo a2ensite server.example.local-ssl.conf
sudo apache2ctl configtest
sudo systemctl reload apache2apache2ctl configtest が Syntax OK でも、秘密鍵の権限や証明書ファイルの不整合で reload 時に失敗することがあります。reload 後のサービス状態も確認します。
sudo systemctl status apache2 --no-pager
sudo journalctl -u apache2 -n 50 --no-pagercurl で確認する
クライアント側で内部 CA を信頼している場合、curl で証明書検証が通るはずです。
curl -v https://server.example.local/内部 CA をまだ信頼していないクライアントでは、証明書検証エラーになります。その場合は、クライアント側に CA 証明書を配置して update-ca-certificates を実行します。curl -k は確認用の回避策であり、恒久運用の設定ではありません。
openssl s_client で確認する
証明書チェーン、SAN、検証結果を詳しく見る場合は openssl s_client を使います。SNI を使うため、-servername も指定します。
openssl s_client \
-connect server.example.local:443 \
-servername server.example.local \
-verify_return_error \
-CAfile /etc/ssl/certs/ca-certificates.crt検証が通る場合は Verify return code: 0 (ok) が表示されます。エラーになる場合は、CA 信頼、SAN、証明書期限、秘密鍵との対応関係を確認します。
証明書と秘密鍵の対応を確認する
証明書と秘密鍵の組み合わせが間違っていると Apache は正しく起動できません。RSA 鍵の場合は modulus を比較できます。
openssl x509 -noout -modulus -in /etc/ssl/local/server.example.local.crt | openssl md5
sudo openssl rsa -noout -modulus -in /etc/ssl/local/server.example.local.key | openssl md5楕円曲線鍵などでは確認方法が異なるため、証明書作成時のファイル名と配置先を混同しない運用が大切です。
HTTP から HTTPS へのリダイレクト
TLS を有効化することと、HTTP を HTTPS へリダイレクトすることは別の設計です。必要であれば、80 番側の VirtualHost でリダイレクトします。
sudo tee /etc/apache2/sites-available/server.example.local.conf <<'EOF'
<VirtualHost *:80>
ServerName server.example.local
Redirect permanent / https://server.example.local/
</VirtualHost>
EOF
sudo a2ensite server.example.local.conf
sudo apache2ctl configtest
sudo systemctl reload apache2内部向けの検証サーバーでは HTTP を残して切り分けに使う場合もあります。公開サイトや認証を扱うサイトでは、HTTPS への統一を基本にした方が安全です。
運用上の注意
- 証明書の SAN に実際の接続名を含める
- 秘密鍵を広い権限で配置しない
- 証明書検証エラーを
-kや検証無効化で恒久回避しない - Apache 側の設定とクライアント側の CA 信頼を分けて確認する
- HTTP/2 や WAF は TLS 有効化後の追加設定として扱う
まとめ
Ubuntu 22.04 の Apache で TLS を有効化するには、a2enmod ssl、TLS 用 VirtualHost、証明書と秘密鍵の配置、apache2ctl configtest、curl / openssl s_client による確認を順に行います。
内部 CA の証明書を使う場合、Apache はサーバー証明書と秘密鍵を提示し、クライアント側が内部 CA を信頼しているかで検証結果が決まります。証明書エラーを回避するのではなく、CA 信頼、SAN、秘密鍵の権限を正しく整えることが安定した TLS 運用につながります。




