Apache 2.2 - mod_ssl による通信経路の暗号化 (自己署名証明書)

失敗

セキュリティ証明書の名前が無効であるか、またはサイト名と一致しません。
図1 セキュリティ警告

図1 セキュリティ警告

「セキュリティ証明書の名前が無効であるか、またはサイト名と一致しません。」 (左図 3 番目の警告)

サーバ証明書の有効期限が迫ってきため、新しいサーバ証明書に差し替えました。 すると、上記警告が表示されるようになったのです。

自己署名証明書として作成したサーバ証明書ですから、左図 1 番目の警告が表示されるのは仕方ありません。
しかし、左図 3 番目の警告が表示されるのは問題です。

環境

このレポートは、以下の環境について記述したものです。

OS openSUSE 10.2
SSL / TLS OpenSSL
  • openssl 0.9.8d
  • openssl-devel 0.9.8d
Web サーバ Apache 2.2.4

原因

自サイトを CA (Certification Authority : 認証局) とする自己署名証明書を作成する場合も、 第三者機関の CA に証明書を作成してもらう場合と同じ様に、サイト運営者の身元情報が要求されます。

この身元情報の一部として要求された「ホストのドメイン名」を誤って入力してしまったことが、警告の原因でした。 こっそり修正して、もみ消したくなるような失敗ですが、恥を忍んでレポートします。

解決策

Apache 2.2 において、自己署名証明書を使用した SSL 通信の設定手順を説明します。

本稿では、OS に openSUSE (SUSE Linux のオープンソース版) を使用しています。 管理ツールやコマンドのパスに関する部分は、ご使用中の環境に合わせて適宜読み替えてください。

(1) OpenSSL のインストール

SSL (Secure Socket Layer) / TLS (Transport Layer Security) の実装には OpenSSL を使用します。

openSUSE 10.2 には、OpenSSL のランタイムである openssl パッケージが標準インストールされています。 ただし、開発ライブラリである openssl-devel パッケージはインストールされていません。 Apache で SSL 通信するには、この開発ライブラリが必要となります。 YaST (Yet Another Setup Tool : ヤスト) のソフトウェア管理機能などを使い、openssl-devel パッケージをインストールしてください。

なお、標準インストールされている openssl コマンドのパスは /usr/bin/openssl です。

YaST から openss-devel をインストール
図2 YaST から openss-devel をインストール

(2) Apache と mod_ssl のインストール

Apache において、SSL / TLS の処理は mod_ssl モジュールが担当します。 mod_ssl モジュールは、バージョン 2.0 以降、Apache 本体に組み込まれるようになりました。 よって、configure のオプションに --enable-ssl を指定するだけでインストールは完了します。

tar zxvf httpd-2.2.4.tar.gz
cd httpd-2.2.4
./configure --enable-ssl
make
make install

(3) 秘密鍵の作成

公開鍵暗号方式を利用したセキュリティ技術である SSL では、RSA (Rivest Shamir Adleman) 秘密鍵が必要になります。

RSA 秘密鍵は任意のディレクトリに、任意のファイル名で作成して構いません (ただし、アクセス権には要注意) 。
本稿では、mod_ssl の 設定ファイルである httpd-ssl.conf に定義されているディレクトリ (/usr/local/apache2/conf) 、ファイル名 (server.key) を使用します。

cd /usr/local/apache2/conf

openssl genrsa コマンドで、RSA 秘密鍵を作成します。
デフォルトでは、鍵長 512 ビットの RSA 秘密鍵が作成されます。 鍵長を変更するには、引数にビット数を指定します (暗号強度を高めるために 1024 または 2048 ビットに変更することを推奨)。
以下の例では、鍵長 1024 ビットの RSA 秘密鍵を作成しています。

/usr/bin/openssl genrsa -out server.key 1024

作成した RSA 秘密鍵は、極秘にしなければなりません。 openssl rsa コマンドで、RSA 秘密鍵自体を暗号化しておくことをお勧めします。
以下の例では、RSA 秘密鍵を AES (Advanced Encryption Standard) 256 ビットで暗号化しています (暗号の種類は 補足 を参照) 。 コマンド入力後、パスフレーズの入力を要求されます。 ここで入力するパスフレーズは忘れないように、控えて置いてください。

/usr/bin/openssl rsa -aes256 -in server.key -out server.key

【注意】
RSA 秘密鍵自体の暗号化は、セキュリティ強度の面でメリットがあります。
その一方、Apache の自動起動や、Apache の起動コマンドが含まれるシェルスクリプトの動作に影響を与えるデメリットもあります (Apache 起動時にパスフレーズの入力が要求されるため) 。

(4) 自己署名証明書の作成

(3) で作成した秘密鍵を元に、自己署名証明書を作成します。

自己署名証明書も任意のディレクトリに、任意のファイル名で作成して構いません。
本稿では、httpd-ssl.conf に定義されているディレクトリ (/usr/local/apache2/conf) 、ファイル名 (server.crt) を使用します。

openssl req コマンドに -new 、-x509 オプションを付けることにより、自己署名証明書を作成します。 なお、-days オプションで証明書の有効期限を指定することができます。
以下の例では、有効期限が 365 日の自己署名証明書を作成しています。

/usr/bin/openssl req -new -x509 -days 365 -key server.key -out server.crt

コマンドを入力すると、-key オプションで指定した RSA 秘密鍵のパスフレーズを要求されます (秘密鍵自体を暗号化している場合のみ) 。 その後、サイト運営者の身元情報として、以下の情報を要求されます。

ターミナルの表示内容 入力内容
Country Name (2 letter code) [AU] 国コード [例] JP
State or Province Name (full name) [Some-State] 都道府県名 [例] Saitama
Locality Name (eg, city) [] 市町村名 [例] Kawaguchi
Organization Name (eg, company) [Internet Widgits Pty Ltd] 企業名 [例] Example Co
Organization Unit Name (eg, section) [] 部署名 [例] Sales
Common Name (eg, YOUR name) [] ホストのドメイン名 [例] www.example.com
Email Address [] サイト運営者のメールアドレス
[例] info@example.com

(5) httpd.conf の修正

Apache 2.2 では、mod_ssl の 設定ファイルとして httpd-ssl.conf が用意されています。 httpd-ssl.conf を読み込めるように、httpd.conf を修正しましょう。

[httpd.conf - 末端行の '#' を削除し、httpd-ssl.conf のロードを有効にする]
Include conf/extra/httpd-ssl.conf

(6) httpd-ssl.conf の修正

VirtualHost ディレクティブの中に、SSL 通信時の設定が定義されています。 ドキュメントルートやサーバ名、ログなどの設定を、各自の環境に合わせて修正してください。

RSA 秘密鍵や自己署名証明書のファイル名、または配置先ディレクトリを変更した場合は、SSLCertificateFile ディレクティブ、 SSLCertificateKeyFile ディレクティブに指定されているパスを修正しなければなりません。

[httpd-ssl.conf - 証明書、秘密鍵のパスを修正する]
<VirtualHost _default_:443>
# 省略
SSLCertificateFile /usr/local/apache2/conf/server.crt     # 証明書のパス
SSLCertificateKeyFile /usr/local/apache2/conf/server.key  # 秘密鍵のパス
# 省略
</VirtualHost _default_:443>

以上で、SSL 通信を行うための設定は完了です。

(7) Apache の起動

Apache 2.0 以前において、SSL 通信を開始するには apachectl startssl コマンドで起動する必要がありました。 しかし、Apache 2.2 では apachectl start コマンドで HTTP 通信、SSL 通信ともに開始されるように変更されています。 旧バージョンをお使いになっていた方は、ご注意ください。

/usr/local/apache2/bin/apachectl start

補足

■ openssl rsa コマンドで使用できる主な暗号

openssl res コマンドで RSA 秘密鍵を暗号化することができます。
『解決策』で示した例では AES で暗号化しましたが、使用できる暗号は他にもあります。
以下に、その一部を挙げます。

暗号化方式 説明 パラメータ
DES
(Data Encryption Standard : デス)
1977 年に米国商務省標準技術局 が暗号化標準として選定した共通鍵暗号化アルゴリズム。年代物のため、暗号強度に難あり。 -des
Triple DES
(Triple DES : トリプル デス)
DES の強化版。DES を三重にかけることで強度を高めた共通鍵暗号化アルゴリズム。 -des3
AES
(Advanced Encryption Standard : エーイーエス)
2000 年、米国商務省標準技術局が DES の後継として選定した共通鍵暗号化アルゴリズム。鍵長は 128 ビット、192 ビット、256 ビットの3種類あり。 -aes128
-aes192
-aes256

関連レポート

参考サイト

更新履歴

コメント

コメント投稿
(非公開)
     « アイコン一覧 »
(必須)

作成日:2007/08/22
更新日:2010/01/15