HTTPS(SSL/TLS)化

スポンサーリンク
RockyLinux
この記事は約17分で読めます。
ランキングに参加しています。応援よろしくお願いします。
ブログランキング・にほんブログ村へ 人気ブログランキングへ FC2ブログランキングへ
スポンサーリンク
この記事が気に入ったら
フォローしよう
最新情報をお届けします。

前回の「WordPress移設」に続いて、Rocky Linux 9 サーバ構築手順次のステップは、「HTTPS(SSL/TLS)化編」について設定を行います。

この設定により、Let’s EncryptのSAN(Subject Alternative Name)証明書を使用してサイトをHTTPS化し、安全な通信を実現します。
当初、ワイルドカード証明書で設定していましたが、前回、ホスト毎のSAN証明書を使用するように変更したので、ここでは、SAN証明書の設定要領とします。
ホスト毎のSAN証明書を使用することで、自動更新が可能になり、証明書管理が容易になります。

免責事項:

本記事の内容は筆者の環境で動作確認したものですが、すべての環境での動作を保証するものではありません。本記事の手順を実施する際は、以下の点にご注意ください。

  • 必ず事前にバックアップを取得してください
  • 本番環境での作業前にテスト環境で十分に検証してください
  • 本記事の内容を参考に作業を行った結果生じた損害について、筆者は一切の責任を負いません
  • 各コマンドの実行は自己責任でお願いします

当ブログサイトを運用しているサーバは、「KAGOYA JAPAN」で提供されている「KAGOYA CLOUD VPS」を利用しています。

SSL/TLS証明書の取得と管理に必要なパッケージをインストールします。

sudo dnf install -y certbot python3-certbot-nginx

'~ 中略 ~'

Installed:
  certbot-2.11.0-1.el9.noarch
  fontawesome-fonts-1:4.7.0-13.el9.noarch
  python-josepy-doc-1.13.0-1.el9.noarch
  python3-acme-2.11.0-1.el9.noarch
  python3-certbot-2.11.0-1.el9.noarch
  python3-certbot-nginx-2.11.0-1.el9.noarch
  python3-cffi-1.14.5-5.el9.x86_64
  python3-configargparse-1.7-1.el9.noarch
  python3-cryptography-36.0.1-4.el9.x86_64
  python3-importlib-metadata-4.12.0-2.el9.noarch
  python3-josepy-1.13.0-1.el9.noarch
  python3-parsedatetime-2.6-5.el9.noarch
  python3-ply-3.11-14.el9.0.1.noarch
  python3-pyOpenSSL-21.0.0-1.el9.noarch
  python3-pycparser-2.20-6.el9.noarch
  python3-pyparsing-2.4.7-9.el9.noarch
  python3-pyrfc3339-1.1-11.el9.noarch
  python3-zipp-3.20.1-2.el9.noarch

Complete!

各パッケージの説明

  • certbot: Let’s Encryptのクライアントツール
  • python3-certbot-nginx: Nginx用のプラグイン
sudo dnf install -y bind-utils

'~ 中略 ~'

Installed:
  bind-libs-32:9.16.23-18.el9_4.6.x86_64
  bind-license-32:9.16.23-18.el9_4.6.noarch
  bind-utils-32:9.16.23-18.el9_4.6.x86_64
  fstrm-0.6.1-3.el9.x86_64
  libuv-1:1.42.0-2.el9_4.x86_64
  protobuf-c-1.3.3-13.el9.x86_64

Complete!

主な用途

  • bind-utils: DNSサーバーソフトウェアであるBIND(Berkeley Internet Name Domain)を管理するためのユーティリティ(nslookup、digコマンドなど)

複数のサブドメインを含むSAN証明書を取得します。今回は maruweb.jp.net ドメインと marusv.maruweb.jp.net、www.maruweb.jp.net、art.maruweb.jp.net の3つのホストドメインを含む証明書を取得します。

sudo certbot --nginx --cert-name maruweb.jp.net -d maruweb.jp.net -d marusv.maruweb.jp.net -d www.maruweb.jp.net -d art.maruweb.jp.net

パラメータの説明

  • --nginx: Nginx用のプラグインを使用
  • --cert-name: 証明書の識別名(既存証明書を上書きする場合に指定)
  • -d: 証明書に含めるドメイン/ホスト名(複数指定可能)

証明書が正常に取得されると、以下のメッセージが表示されます。

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You are updating certificate maruweb.jp.net to include new domain(s):
+ art.maruweb.jp.net
+ marusrv.maruweb.jp.net
+ maruweb.jp.net
+ www.maruweb.jp.net

You are also removing previously included domain(s):
- *.maruweb.jp.net

Did you intend to make this change?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(U)pdate certificate/(C)ancel: U
Renewing an existing certificate for maruweb.jp.net and 3 more domains

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/maruweb.jp.net/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/maruweb.jp.net/privkey.pem
This certificate expires on 2025-12-21.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for maruweb.jp.net to /etc/nginx/nginx.conf
Successfully deployed certificate for marusrv.maruweb.jp.net to /etc/nginx/nginx.conf
Successfully deployed certificate for www.maruweb.jp.net to /etc/nginx/conf.d/www.maruweb.jp.net.conf
Successfully deployed certificate for art.maruweb.jp.net to /etc/nginx/conf.d/art.maruweb.jp.net.conf
Your existing certificate has been successfully renewed, and the new certificate has been installed.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

証明書ファイルの配置場所

  • 公開鍵証明書: /etc/letsencrypt/live/maruweb.jp.net/fullchain.pem
  • 秘密鍵: /etc/letsencrypt/live/maruweb.jp.net/privkey.pem

Nginxのメイン設定ファイルにHTTPからHTTPSへのリダイレクト設定を追加します。

sudo vi /etc/nginx/nginx.conf

HTTPS化に伴う追加設定(抜粋)
httpブロックの最後に以下のserverブロックを追加します。

http {
'~ 既存の設定 ~'

    # HTTP to HTTPS redirect
    server {
        listen       80;
        listen       [::]:80;
        server_name  www.maruweb.jp.net art.maruweb.jp.net;
        return       301 https://$host$request_uri;
    }
}

設定のポイント

  • HTTPリクエストをHTTPSにリダイレクト(301永続リダイレクト)
  • server_nameには、証明書に含めた全てのドメインを記載

SSL/TLS関連の設定を共通ファイルとして作成します。

sudo vi /etc/nginx/ssl.conf

設定内容

# SSL証明書のパス
ssl_certificate "/etc/letsencrypt/live/maruweb.jp.net/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/maruweb.jp.net/privkey.pem";

# セッション設定
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

# SSLプロトコルの設定
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:+AESCCM8:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE;
ssl_prefer_server_ciphers on;

# OCSPスタプリング
ssl_stapling on;
ssl_stapling_verify on;

# HSTS(HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

# セキュリティヘッダー
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;

設定パラメータの説明

  • ssl_certificate: 公開鍵証明書のファイルパス
  • ssl_certificate_key: 秘密鍵のファイルパス
  • ssl_session_cache: SSLセッション情報を一時保存(パフォーマンス向上)
  • ssl_session_timeout: セッションキャッシュの保持時間
  • ssl_protocols: 使用する暗号化プロトコル(TLS 1.2以上を推奨)
  • ssl_ciphers: 使用する暗号スイート
  • ssl_stapling: OCSPスタプリングを有効化(証明書の検証を高速化)
  • Strict-Transport-Security: HSTS(常にHTTPS接続を強制)
sudo vi /etc/nginx/conf.d/www.maruweb.jp.net.conf

HTTPS化に伴う変更点(抜粋)
既存のHTTP設定(port 80)を以下のHTTPS設定(port 443)に変更します。

# Main Site Settings
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name www.maruweb.jp.net;
    include /etc/nginx/ssl.conf;

    root /var/www/html/wp;

    # ルートアクセス時のリダイレクト
    location = / {
        return 301 https://www.maruweb.jp.net/wp/;
    }

'~ その他の設定は既存の設定を維持 ~'

}

変更のポイント

  • listen 80listen 443 ssl http2 に変更
  • include /etc/nginx/ssl.conf を追加してSSL設定を読み込み
  • その他のlocation設定やPHP設定は既存の設定をそのまま使用
sudo vi /etc/nginx/conf.d/art.example.com.conf

HTTPS化に伴う変更点(抜粋)
メインサイトと同様に、既存のHTTP設定をHTTPS設定に変更します。

# Art Site Settings
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name art.maruweb.jp.net;
    include /etc/nginx/ssl.conf;

    root /var/www/html;

    # ルートアクセス時のリダイレクト
    location = / {
        return 301 https://art.maruweb.jp.net/366/;
    }

    ssl_certificate /etc/letsencrypt/live/maruweb.jp.net/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/maruweb.jp.net/privkey.pem; # managed by Certbot

'~ その他の設定は既存の設定を維持 ~'

}

変更のポイント

  • メインサイトと同じSSL設定ファイル(ssl.conf)を使用
  • server_nameをサブドメイン名に設定
  • その他の設定は既存のHTTP設定をそのまま使用可能

WordPressでAll In One WP Securityプラグインを使用している場合、設定ファイルのパスを確認します。

sudo vi /var/www/html/wp/aios-bootstrap.php

設定内容(抜粋)

$GLOBALS['aiowps_firewall_data'] = array(
    'ABSPATH' => '/var/www/html/wp/',
);
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl restart nginx

HTTPSポート(443)を開放します。

sudo firewall-cmd --add-service=https
success

sudo firewall-cmd --runtime-to-permanent
success

sudo firewall-cmd --list-services
cockpit dhcpv6-client http https ssh

SSL Labs の SSL Server Test を使用して、SSL/TLS設定の品質を確認します。

テストURL
https://www.ssllabs.com/ssltest/

ドメイン名を入力してテストを実行し、評価がA以上であることを確認してください。

ブラウザで以下のURLにアクセスし、HTTPSで正常に表示されることを確認します。

確認ポイント

  • アドレスバーに鍵マークが表示されている
  • 証明書情報が正しい
  • HTTPからHTTPSへ自動リダイレクトされる
  • 画像やCSS、JavaScriptが正常に読み込まれている
  • プラグインが正常に動作している

Let’s Encryptの証明書は90日で期限が切れるため、自動更新の動作確認を行います。

sudo certbot renew --dry-run

正常な場合の出力例

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/maruweb.jp.net.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for maruweb.jp.net and 3 more domains

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/maruweb.jp.net/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sudo systemctl status certbot-renew.timer

Certbotは自動的にtimerを作成し、定期的に証明書の更新を試みます。

自動更新を無効化して手動で更新を行う場合は、以下の手順を実行します。

sudo systemctl stop certbot-renew.timer
sudo systemctl status certbot-renew.timer
sudo systemctl disable certbot-renew.timer
Removed "/etc/systemd/system/timers.target.wants/certbot-renew.timer".

sudo systemctl status certbot-renew.service
sudo systemctl status certbot-renew.timer

手動更新コマンド

sudo certbot renew

注意事項

  • 自動更新の無効化は推奨されません
  • 手動更新を選択した場合は、証明書の期限切れに注意してください
  • 証明書の期限が切れると、サイトへのアクセスができなくなります

本記事では、RockyLinux9サーバでSAN証明書を使用したHTTPS化設定について説明しました。複数のサブドメインを1つの証明書で管理できるため、証明書の管理がシンプルになります。

Rocky Linux 9 サーバ構築手順一覧

実施内容

  • Let’s Encrypt SAN証明書の取得
  • Nginx SSL/TLS設定
  • HTTP→HTTPSリダイレクト設定
  • セキュリティヘッダーの追加
  • 証明書の自動更新設定

注意事項

  • 証明書の自動更新は有効にしておくことを推奨します
  • 定期的にSSL Labsでテストを実行し、セキュリティレベルを維持してください
  • セキュリティヘッダーは環境に応じて適切に設定してください

次回は「WordPress高速化設定編」として、PHP設定やMariaDB高速化設定についての手順を実施予定です。

コメント

タイトルとURLをコピーしました