パスフレーズで保護された SSL 秘密鍵を用いた Apache / NGINX 設定
対象読者
本ドキュメントは,学内の Web サーバ管理者を対象とする.
概要
本ドキュメントの目的
秘密鍵にパスフレーズを設定した状態で Web サーバを運用する場合,サーバ起動時にパスフレーズの入力が必要となる. 本ドキュメントでは,この入力作業を自動化する方法を示す.
検証環境
以下の環境で動作を確認した.
testuser@testbench:~$ uname -a
Linux testbench.cc.uec.ac.jp 6.8.0-79-generic #79-Ubuntu SMP PREEMPT_DYNAMIC Tue Aug 12 14:42:46 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
testuser@testbench:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.3 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
testuser@testbench:~$ apt list apache2 nginx
Listing... Done
apache2/noble-updates,noble-security,now 2.4.58-1ubuntu8.8 amd64 [installed]
nginx/noble-updates,noble-security,now 1.24.0-2ubuntu7.5 amd64 [installed]
Apache2 での設定方法
設定の全体像
Apache2 では,シェル・スクリプトを用いてパスフレーズを自動入力する. 設定後のディレクトリ構成は以下の通りである.
/etc/apache2/
├── apache2.conf
├── conf.d/
│ └── pass_ssl.sh # パスフレーズを返すスクリプト
├── ssl/
│ ├── server.crt # SSL 証明書
│ └── server.key # パスフレーズ付き秘密鍵
└── (その他の設定ファイル)
設定手順
ステップ 1: パスフレーズ付き秘密鍵の作成
パスフレーズを設定した秘密鍵を作成する.
注釈
本例では,パスフレーズを ThisIsPassphrase として説明する.
ステップ 2: 証明書と秘密鍵の配置
作成した証明書と秘密鍵を /etc/apache2/ssl/ に配置する.Apache 設定ファイルで以下のディレクティブを設定する.
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
ステップ 3: パスフレーズ自動入力スクリプトの作成
/etc/apache2/conf.d/passphrase.sh を作成する.パスフレーズを出力するスクリプトを記述する.
#!/bin/sh
/usr/bin/echo "ThisIsPassphrase"
testuser@testbench:~$ sudo vim /etc/apache2/conf.d/passphrase.sh
ステップ 4: スクリプトの権限設定
スクリプトを実行可能にする.root ユーザのみが読み取り・実行できるように権限を設定する.
testuser@testbench:~$ sudo chmod 500 /etc/apache2/conf.d/passphrase.sh
testuser@testbench:~$ sudo chown root:root /etc/apache2/conf.d/passphrase.sh
ステップ 5: Apache の設定変更
Apache 設定ファイル (通常は /etc/apache2/mods-available/ssl.conf または apache2.conf) で, SSLPassPhraseDialog ディレクティブを変更する.
# 変更前
SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase
# 変更後
SSLPassPhraseDialog exec:/etc/apache2/conf.d/passphrase.sh
ステップ 6: 動作確認
Apache を再起動する.パスフレーズの入力なしで起動できることを確認する.
testuser@testbench:~$ sudo systemctl restart apache2
testuser@testbench:~$ sudo systemctl status apache2
NGINX での設定方法
設定の全体像
NGINX では,パスフレーズを記載したテキスト・ファイルを用いて自動入力を行う. 設定後のディレクトリ構成は以下の通りである.
/etc/nginx/
├── nginx.conf
├── sites-available/
│ └── default
├── sites-enabled/
│ └── default -> /etc/nginx/sites-available/default
└── ssl/
├── passphrase # パスフレーズを記載したファイル
├── server.crt # SSL 証明書
└── server.key # パスフレーズ付き秘密鍵
設定手順
ステップ 1: パスフレーズ付き秘密鍵の作成
パスフレーズを設定した秘密鍵を作成する.
注釈
本例では,パスフレーズを ThisIsPassphrase として説明する.
ステップ 2: 証明書と秘密鍵の配置
作成した証明書と秘密鍵を /etc/nginx/ssl/ に配置する.NGINX 設定ファイルで以下のディレクティブを設定する.
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
...
}
ステップ 3: パスフレーズ・ファイルの作成
/etc/nginx/ssl/passphrase を作成する.パスフレーズを記載する.
testuser@testbench:~$ sudo sh -c 'echo "ThisIsPassphrase" > /etc/nginx/ssl/passphrase'
または,エディタで直接編集する.
ThisIsPassphrase
ステップ 4: パスフレーズ・ファイルの権限設定
root ユーザのみが読み取れるように権限を設定する.
testuser@testbench:~$ sudo chmod 400 /etc/nginx/ssl/passphrase
testuser@testbench:~$ sudo chown root:root /etc/nginx/ssl/passphrase
ステップ 5: NGINX の設定変更
NGINX 設定ファイルの server ブロック内に, ssl_password_file ディレクティブを追加する.
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_password_file /etc/nginx/ssl/passphrase; # この行を追加
...
}
ステップ 6: 動作確認
NGINX を再起動する.パスフレーズの入力なしで起動できることを確認する.
testuser@testbench:~$ sudo systemctl restart nginx
testuser@testbench:~$ sudo systemctl status nginx