Apache サーバー (Linux) への SSL 証明書のインストール

更新日時
Copy as MD

単一ドメイン、マルチドメイン、またはワイルドカード SSL 証明書をインストールして、Linux 上の Apache サーバーで HTTPS を有効化します。本ガイドでは、証明書ファイルの準備、mod_ssl および VirtualHost の構成、デプロイ後の検証について説明します。

前提条件

作業を開始する前に、以下の要件を満たしていることを確認してください。

  • 信頼された認証局(CA)によって発行された有効なSSL証明書。証明書の有効期限が間近に迫っているか、すでに期限切れになっている場合は、続行する前に更新してください

  • 保護したいすべてのドメインをカバーする証明書です。紐付けられたドメインを追加または変更するには、新しい証明書を購入するか、紐付けられたドメインを更新するしてください。

  • サーバー上の root アカウント、または sudo 権限を持つアカウント。

  • ご利用のドメインの DNS レコードが、サーバーのパブリック IP アドレスに解決されること。

  • ドメイン名の名前解決:ドメインの DNS レコードが設定され、サーバーのパブリック IP アドレスに解決されていること。

ドメインカバレッジルール:

証明書タイプカバレッジ
完全一致example.comexample.com のみを保護します。www.example.comwww.example.com
ワイルドカード*.example.com は第 1 階層のサブドメイン(例:www.example.coma.example.com)をカバーしますが、ルートドメイン example.coma.b.example.com
説明

複数階層のサブドメインをカバーするには、バインドドメイン フィールドに、該当するドメイン(例:a.b.example.com)または一致するワイルドカード(例:*.b.example.com)を含める必要があります。

ステップ 1:証明書ファイルの準備

  1. SSL 証明書管理ページに移動します。ご利用の証明書の 操作 列で、証明書のダウンロード をクリックします。ダウンロード タブで、サーバータイプ として Apache を選択し、パッケージをダウンロードします。

  2. ダウンロードしたパッケージを展開します。パッケージには、証明書署名要求 (CSR) の生成方法に応じて、2 つまたは 3 つのファイルが含まれます。

    説明

    OpenSSL または Keytool を使用して CSR を生成した場合、秘密鍵はローカルマシン上にのみ保存され、ダウンロードしたパッケージには含まれません。秘密鍵を紛失した場合、証明書は使用できません。新しい証明書を購入し、新しい CSR と秘密鍵を生成してください。

    シナリオパッケージ内のファイル操作
    システム管理キー(Alibaba Cloud で CSR を生成)<bound_domain_name>_public.crt<bound_domain_name>_chain.crt<bound_domain_name>.keyこれら 3 つのファイルを安全な場所に保管します。
    自己管理キー(OpenSSL または Keytool で CSR を生成)<bound_domain_name>_public.crt<bound_domain_name>_chain.crt のみこれらのファイルを、CSR 生成時にローカルに保存した秘密鍵ファイルとともにデプロイします。
  3. 証明書ファイル、証明書チェーンファイル、および秘密鍵ファイルを、サーバー上の安全なディレクトリ(例:/etc/ssl/cert)にアップロードします。

    説明

    ファイルをアップロードするには、PuTTY、Xshell、WinSCP などのリモートログインツールを使用します。サーバーが Alibaba Cloud Elastic Compute Service (ECS) インスタンスの場合、「ファイルのアップロードまたはダウンロード」をご参照ください。

ステップ 2:ポート 443 の開放

ご利用のサーバーのファイアウォールおよびセキュリティグループが、ポート 443 のインバウンドトラフィックを許可していることを確認します。

ポート 443 が開放されているか確認する

次のコマンドを実行して、ポート 443 の接続性をテストします。<your_server_public_ip> は、ご利用のサーバーのパブリック IP アドレスに置き換えてください。

RHEL/CentOS

command -v nc > /dev/null 2>&1 || sudo yum install -y nc
# <your_server_public_ip> をご利用のサーバーのパブリック IP アドレスに置き換えます。
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443

ポート 443 が開放されている場合の期待される出力:Ncat: Connected to <your_server_public_ip>:443

Debian/Ubuntu

command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat
# <your_server_public_ip> をご利用のサーバーのパブリック IP アドレスに置き換えます。
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443

ポート 443 が開放されている場合の期待される出力:Connection to <your_server_public_ip> port [tcp/https] succeeded! または [<your_server_public_ip>] 443 (https) open

ポート 443 が開放されていない場合は、以下の 2 つのサブステップを実行してください。

セキュリティグループでポート 443 を開放する

重要

ご利用のサーバーがクラウドプラットフォーム上で動作している場合、そのセキュリティグループがポート 443 の TCP インバウンドトラフィックを許可していることを確認してください。そうでない場合、HTTPS サービスにアクセスできなくなります。以下の手順は Alibaba Cloud ECS を例としています。他のプラットフォームについては、各ドキュメントをご参照ください。

Elastic Compute Service (ECS) インスタンス」ページに移動し、インスタンス名をクリックします。「[セキュリティグループの詳細]」セクションで、「セキュリティグループルールを追加する」をクリックし、以下の設定でルールを追加します:

フィールド
操作許可
プロトコルカスタム TCP
送信先 (現在のインスタンス)HTTPS (443)
送信元0.0.0.0/0 (任意の場所)

システムファイアウォールでポート 443 を開放する

次のコマンドを実行して、アクティブなファイアウォールを特定します。

if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
    echo "firewalld"
elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then
    echo "ufw"
elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then
    echo "nftables"
elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then
    echo "iptables"
elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then
    echo "iptables"
else
    echo "none"
fi

出力が none の場合、これ以上の操作は不要です。それ以外の場合は、ご利用のファイアウォールタイプに応じて以下のコマンドを実行します。

firewalld

sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload

ufw

sudo ufw allow 443/tcp

nftables

sudo nft add table inet filter 2>/dev/null
sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null
sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/null

iptables

sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

iptables ルールを再起動後も維持するには:

*RHEL/CentOS*

sudo yum install -y iptables-services
sudo service iptables save

*Debian/Ubuntu*

sudo apt-get install -y iptables-persistent
sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null

ステップ 3:Apache への証明書のインストール

構成手順は Apache のバージョンによって異なります。まずバージョンを確認し、対応する手順に従ってください。

Apache のバージョンを確認し、SSL モジュールを有効化する

ステップ 3a:Apache のバージョンを確認する

RHEL/CentOS

httpd -v

Debian/Ubuntu

apache2 -v

ステップ 3b:SSL モジュールが有効化されているか確認する

RHEL/CentOS

httpd -M | grep 'ssl_module'

Debian/Ubuntu

apachectl -M | grep 'ssl_module'

モジュールが読み込まれている場合、出力に ssl_module (shared) が含まれます。含まれていない場合は、以下を実行してインストールします。

RHEL/CentOS

sudo yum install -y mod_ssl
# RHEL/CentOS 8.0 以降の場合:
sudo dnf install -y mod_ssl

Debian/Ubuntu

sudo a2enmod ssl

VirtualHost の構成

Apache 2.4.8 以降(推奨)

証明書ファイルを結合する

証明書ファイルとチェーンファイルを連結して、単一のフルチェーンファイルを作成します。

# サーバー証明書に証明書チェーンを追記して、完全なチェーンファイルを作成します。
cat domain_name_public.crt domain_name_chain.crt > domain_name_fullchain.pem

これにより、domain_name_fullchain.pem および domain_name.key の 2 つのファイルが生成されます。

SSL VirtualHost 構成を編集する

説明

構成ファイルは通常、/etc/httpd/conf.d/ssl.conf(RHEL/CentOS)または /etc/apache2/sites-available/your-site-ssl.conf(Debian/Ubuntu)にあります。

vim /etc/httpd/conf.d/ssl.conf

VirtualHost ブロック内の SSL パラメーターを更新します。

<VirtualHost *:443>

    # example.com を保護したいドメイン名に置き換えます。
    ServerName example.com

    # 証明書ファイル。結合済みのフルチェーンファイルへのパスを使用します。
    SSLCertificateFile /etc/ssl/cert/domain_name_fullchain.pem

    # 秘密鍵ファイル。ご利用の秘密鍵ファイルへのパスに置き換えます。
    SSLCertificateKeyFile /etc/ssl/cert/domain_name.key

    # その他の構成
    # ...

</VirtualHost>

Apache 2.4.7 以前

証明書ファイルを準備する

証明書ディレクトリに、domain_name_public.crtdomain_name_chain.crt、および domain_name.key の 3 つのファイルがすべて含まれていることを確認します。

SSL VirtualHost 構成を編集する

説明

構成ファイルは通常、/etc/httpd/conf.d/ssl.conf(RHEL/CentOS)または /etc/apache2/sites-available/your-site-ssl.conf(Debian/Ubuntu)にあります。

vim /etc/httpd/conf.d/ssl.conf

VirtualHost ブロック内の SSL パラメーターを更新します。

<VirtualHost *:443>

    # example.com を証明書にバインドされているドメイン名に置き換えます。
    ServerName example.com

    # 証明書ファイル。ご利用の証明書ファイルへのパスに置き換えます。
    SSLCertificateFile /etc/ssl/cert/domain_name_public.crt

    # 証明書チェーンファイル(別途指定)。実際のパスに置き換えます。
    SSLCertificateChainFile /etc/ssl/cert/domain_name_chain.crt

    # 秘密鍵ファイル。ご利用の秘密鍵ファイルへのパスに置き換えます。
    SSLCertificateKeyFile /etc/ssl/cert/domain_name.key

    # その他の構成
    # ...

</VirtualHost>

Apache の構文検証と再読み込み

構成の構文をチェックします。

RHEL/CentOS

sudo httpd -t

Debian/Ubuntu

sudo apache2ctl -t

出力が Syntax OK の場合、証明書を適用するために Apache を再読み込みまたは再起動します。

RHEL/CentOS

# 再読み込み(グレースフル、推奨):
sudo systemctl reload httpd

# 再起動(強制再起動):
sudo systemctl restart httpd

Debian/Ubuntu

# 再読み込み(グレースフル、推奨):
sudo systemctl reload apache2

# 再起動(強制再起動):
sudo systemctl restart apache2

ステップ 4:インストールの検証

ブラウザで https://yourdomain を開きます(yourdomain は実際のドメインに置き換えてください)。アドレスバーにロックアイコンが表示されれば、証明書が有効になっています。

image

ロックアイコンが表示されない場合やアクセスエラーが発生する場合は、ブラウザのキャッシュをクリアするか、シークレットモードで再試行してください。

Chrome 117 以降では、image アイコンが image に置き換えられています。このアイコンをクリックすると、証明書の詳細を確認できます。

説明

引き続き問題が発生する場合は、下記のよくある質問セクションをご参照ください。

本番環境に適用

本番環境にデプロイする前に、以下のベストプラクティスを適用してください。

  • root 以外のサービスアカウントを使用する:Apache 専用の、特権の低いシステムユーザーを作成します。サーバーを root または管理者アカウントで実行しないでください。

    説明

    SSL 終端をロードバランサーレイヤーで行うことを検討してください。つまり、Server Load Balancer (SLB) 上に証明書をデプロイし、HTTPS を処理して復号化された HTTP トラフィックをバックエンドサーバーに転送します。

  • コード内に認証情報を含めない:パスワードや秘密鍵を構成ファイルにハードコードしないでください。認証情報は環境変数、HashiCorp Vault、またはクラウドのキーマネジメントサービス経由で注入してください。

  • HTTP から HTTPS へのリダイレクトを設定する:中間者攻撃を防ぐため、Apache を構成してすべての HTTP トラフィックを HTTPS にリダイレクトします。

  • レガシ TLS プロトコルを無効化する:Apache の構成で、SSLv3、TLSv1.0、TLSv1.1 を無効化します。TLSv1.2 および TLSv1.3 のみを有効にしてください。

  • 有効期限前のモニタリングおよび更新: デプロイメント後、ドメインモニタリングを有効化します。Alibaba Cloud は証明書の有効性を確認し、有効期限前に更新のリマインダーを送信します。詳細については、「パブリックドメイン名モニタリングの購入および有効化」をご参照ください。

よくある質問

インストール後に HTTPS にアクセスできない — 何を確認すればよいですか?

以下のチェックを順番に実施してください。

  1. ポート 443 がブロックされている:セキュリティグループおよびシステムファイアウォールでポート 443 が開放されていることを確認します。「ステップ 2:ポート 443 の開放」をご参照ください。

  2. ドメイン不一致:アクセスしているドメインが、証明書の バインドドメイン に記載されていません。「前提条件」のドメインカバレッジルールをご確認ください。

  3. Apache が再読み込みされていない:構成変更後に Apache サービスが再読み込みまたは再起動されていません。「Apache の構文検証と再読み込み」をご参照ください。

  4. 証明書パスの誤りまたは古いファイル:Apache 構成ファイル内のパスが、最新かつ正しい証明書ファイルを指していることを確認します。

  5. アップストリームサービスの証明書欠落:ドメインがコンテンツデリバリーネットワーク (CDN)、 Server Load Balancer (SLB)、または Web Application Firewall (WAF) を経由する場合、これらのサービスにも証明書をインストールしてください。 トラフィックが複数の Alibaba Cloud サービスを通過する場合の証明書のデプロイ先をご参照ください。

  6. 複数サーバーへのデプロイが不完全:ドメインの DNS が複数のサーバーに解決される場合、すべてのサーバーに証明書をインストールする必要があります。

ブラウザに「証明書名の不一致」または NET::ERR_CERT_COMMON_NAME_INVALID と表示される — これは何を意味しますか?

アクセスしているドメインが、証明書の バインドドメイン に記載されているどのドメインとも一致していません。「前提条件」のドメインカバレッジルールを確認し、必要に応じて証明書を購入または更新してください。

Apache で SSL 証明書を更新または置き換えるにはどうすればよいですか?

  1. 古いファイルのバックアップ:サーバー上の既存の .crt および .key ファイルのコピーを保存します。

  2. 新しいファイルのダウンロード:SSL 証明書管理コンソールから、新しい証明書および秘密鍵を取得します。

  3. ファイルの置き換え:新しいファイルを、Apache 構成で指定されている同じパスにアップロードし、古いファイルを上書きします。

  4. Apache の再読み込み:ダウンタイムなしで新しい証明書を適用するために、sudo systemctl reload httpd(RHEL/CentOS)または sudo systemctl reload apache2(Debian/Ubuntu)を実行します。