◆はじめに
前回の「WordPress移設」に続いて、Rocky Linux 9 サーバ構築手順次のステップは、「HTTPS(SSL/TLS)化編」について設定を行います。
この設定により、Let’s EncryptのSAN(Subject Alternative Name)証明書を使用してサイトをHTTPS化し、安全な通信を実現します。
当初、ワイルドカード証明書で設定していましたが、前回、ホスト毎のSAN証明書を使用するように変更したので、ここでは、SAN証明書の設定要領とします。
ホスト毎のSAN証明書を使用することで、自動更新が可能になり、証明書管理が容易になります。
免責事項:
本記事の内容は筆者の環境で動作確認したものですが、すべての環境での動作を保証するものではありません。本記事の手順を実施する際は、以下の点にご注意ください。
◆環境情報
当ブログサイトを運用しているサーバは、「KAGOYA JAPAN」で提供されている「KAGOYA CLOUD VPS」を利用しています。
- OS: Rocky Linux 9
- Webサーバ: Nginx
- 証明書: Let’s Encrypt(SAN証明書)
- 対象ドメイン: www.maruweb.jp.net、art.maruweb.jp.net
◆HTTPS(SSL/TLS)化
・必要パッケージのインストール
Certbotとプラグインのインストール
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用のプラグイン
DNS管理ツールのインストール
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証明書の取得
証明書取得コマンドの実行
複数のサブドメインを含む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設定
メイン設定ファイルの編集
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設定ファイルの作成
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接続を強制)
メインサイト設定(www.maruweb.jp.net)
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 80をlisten 443 ssl http2に変更include /etc/nginx/ssl.confを追加してSSL設定を読み込み- その他のlocation設定やPHP設定は既存の設定をそのまま使用
サブサイト設定(art.maruweb.jp.net)
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設定の更新
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/',
);
・動作確認
Nginx設定ファイルの構文確認
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Nginxサービスのリロード
sudo systemctl restart nginx
Firewall設定
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/TLS品質の確認
SSL Labs の SSL Server Test を使用して、SSL/TLS設定の品質を確認します。
テストURL:
https://www.ssllabs.com/ssltest/
ドメイン名を入力してテストを実行し、評価がA以上であることを確認してください。

ブラウザでの確認
ブラウザで以下のURLにアクセスし、HTTPSで正常に表示されることを確認します。
確認ポイント:
・証明書の自動更新
更新テストの実行
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つの証明書で管理できるため、証明書の管理がシンプルになります。
実施内容:
- Let’s Encrypt SAN証明書の取得
- Nginx SSL/TLS設定
- HTTP→HTTPSリダイレクト設定
- セキュリティヘッダーの追加
- 証明書の自動更新設定
注意事項:
◆次のステップ
次回は「WordPress高速化設定編」として、PHP設定やMariaDB高速化設定についての手順を実施予定です。





コメント