パスフレーズで保護された 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

参考