9.22. セキュアサイトの構築(mod_ssl)

Web サイトの構築にあたっては、セキュリティを考慮しなければなりません。特に個人や組織のプライバシーに関わる情報やクレジットカード番号や口座番号などを扱う Web サイトの場合には細心の注意が必要です。セキュアな Webサイトを構築するために、SSL(Secure Sockets Layer)の機構が広く利用されています。SSL は、Netscape Communications 社によって開発された暗号化通信プロトコルです。SSL は TCP/IP の上位で動作し、HTTP だけでなく汎用的な設計となっているため、TCP/IP 上に実装される TELNET や FTP などの他のプロトコルにも適用されます。

Turbolinux 11 Server の Apache には、SSL を実装するための DSO モジュールとして mod_ssl が用意されています。mod_ssl は、オープンソースとして非常に有名な OpenSSL プロジェクト(http://www.openssl.org/)から提供されるソフトウェアを利用します。

セキュアサイトを構築するには、openssl、mod_ssl を使用した技術的な解決にとどまらず、そのサイトが本当に信用できるサイトであるかどうかを第三者の機関に証明してもらう必要があります。こうした役割を果たす認証局を CA (Certification Authority)と呼びます。日本の CA には、米 VeriSign 社と NTT グループが共同で設立した日本 VeriSign、日立製作所、富士通、セコムトラストネットなどがあり、これらの認証局により Web サイトの身元を保証してもらうには、以下のようにいくつかの手順を踏む必要があります。

  1. Apache Web サーバーのための秘密鍵(Server Private Key)の作成

  2. サーバー証明書署名要求(Certificate Signing Request - CSR)の作成

  3. 認証局に CSR を提出し、サーバー証明書(Server Certificate)を取得

  4. 取得したサーバー証明書(Server Certificate)を Apache Web サーバーの所定ディレクトリへ保存

最初に、サーバーの秘密鍵と、その秘密鍵とペアになる公開鍵を含んだサーバー証明書署名要求を作成します。次に、作成したサーバー証明書署名要求と企業の身元を保証する書類を CA へ送付します。CA は、サーバー証明書署名要求と身元を検証し、確かにその企業のサイトであることを確認すると、それを保証するためのサーバー証明書を発行します。CA から取得したサーバー証明書はサイトの管理者により、Apache の適切なディレクトリへ格納されます。このように CA により署名されたサーバー証明書を取得したサイトは、アクセスしてきたクラアイアントに対して、そのサイトを所有する組織が確かにその組織であることを保証できるようになります。SSL をサポートする多くの Web ブラウザは、サーバー証明書を発行する CA のリストを保持しています。そして、CA から発行されたサーバー証明書であることを確認すると、ブラウザは自動的にそのサーバー証明書を受け入れ、サイトとの暗号化通信を開始します。もし、リストに存在しない CA からのサーバー証明書を検出した場合、ブラウザはそのサーバー証明書を受け入れるか、もしくは拒否するかをユーザーに問うダイアログを表示します。

このように、セキュアサイトを本稼働するには通常 CA により署名されたサーバー証明書が必要になります。しかし、セキュアサイトを構築するには、自分自身で署名した自己署名証明書を作成し、それを利用することも可能です。ただし、このようなサーバー証明書は CA により署名された証明書と異なり、サイトの身元を保証するものではなく、また、ユーザーのブラウザによって自動認識されないことも把握しておく必要があります。本ガイドでは、セキュアサイトを構築するために、サーバー証明書の作成を行い、mod_ssl モジュールを有効とするまでの一般的な手順について解説しますが、ここで稼動させるセキュアサイトは、自己署名証明書を使用しています。

9.22.1. サーバー側の準備

サーバー側では、SSL 機能を利用するために秘密鍵と公開鍵を生成し、秘密鍵を厳重に保管します。公開鍵は通信相手に広く公開しますが、公開鍵の信頼性を第三者の認証機関である CA に証明してもらう必要があります。最初に、Web サーバーの管理者が準備することは、秘密鍵の生成と厳重な管理、サーバー証明書署名要求(CSR:Certificate Signing Request)の生成および CA への署名の依頼です。

秘密鍵(/etc/pki/tls/private/localhost.key)の生成

/etc/pki/tls/certs/ ディレクトリにサイトの暗号鍵を生成します。 以下のコマンドを実行します。この例では、1024bit 長の RSA 方式の秘密鍵を生成します。Turbolinux 11 Server にはあらかじめダミーの秘密鍵が生成されていますので、必要に応じてバックアップをとってから実行してください。

/etc/httpd/conf/ssl.key/ ディレクトリにサイトの暗号鍵を生成します。 以下のコマンドを実行します。この例では、1024bit 長の RSA 方式の秘密鍵を生成します。Turbolinux 11 Server にはあらかじめダミーの秘密鍵が生成されていますので、必要に応じてバックアップをとってから実行してください。

# cd /etc/pki/tls/private
# mv localhost.key localhost.key_org
# openssl genrsa -out localhost.key -des3 1024
Generating RSA private key, 1024 bit long modulus
...................++++++
....++++++
e is 65537 (0x10001)
Enter pass phrase for localhost.key: ←パスフレーズの入力
Verifying - Enter pass phrase for localhost.key: ←パスフレーズの入力

パスフレーズの入力を要求されます。パスフレーズとはパスワードのようなものですが、パスワードより長い文字列を入力できます。スペースやその他の特殊文字も使用できるため、他人には分かりづらい文章などを入力するのもよいでしょう。

ここで入力したパスフレーズは決して忘れないよう注意してください。Apache の起動時に入力する必要があります。パスフレーズの入力を要求しないようにするには、以下のコマンドを実行して server.key を作成します。ただし、セキュリティ上は、パスフレーズは解除せず、起動する毎に入力することを推奨します。

# openssl genrsa -out /etc/pki/tls/private/localhost.key 1024

作成した localhost.key はセキュアサーバーを構築するために非常に重要なファイルとなります。root だけがアクセスできるようにパーミッションを変更しておきます。

# chmod 600 localhost.key

サーバー証明書署名要求(/etc/pki/tls/csr/localhost.csr)の生成

作成した秘密鍵(localhost.key)をもとに、サーバー証明書署名要求(localhost.csr)を生成します。以下のコマンドを実行します。この例は、有効期限が 365 日のサーバー証明書署名要求を生成します。-key オプションには秘密鍵を指定します。

# mkdir /etc/pki/tls/csr
# chmod 700 /etc/pki/tls/csr
# cd /etc/pki/tls/csr/
# openssl req -new -key ../private/localhost.key -days 365 -out localhost.csr
Enter pass phrase for ../private/localhost.key : ←秘密鍵のパスフレーズ

パスフレーズの入力を要求されますので、秘密鍵(server.key)の生成時に入力したパスフレーズを入力します。続いて一連の設定項目の入力を促されます。各項目への応答を入力してください。応答の例を以下に示します。

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mycompany
Organizational Unit Name (eg, section) []:Doc
Common Name (eg, YOUR name) []:example.com
Email Address []:taro@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

ティップ

必要なデータは CA により異なりますので各認証機関の手順に従ってください。

サーバー証明書署名要求は /etc/pki/tls/csr/localhost.csr ファイルとして出力されます。ここで、入力した情報はサーバー証明書署名要求に組み込まれます。サーバー証明書の発行を要求する際には、このファイルを CA に送付します。サイトを本稼動する前に CA の手続きに従い、サーバー証明書を取得してください。サーバー証明書署名要求の提出には、Web ページのフォームや E-mail を利用することが多いようです。CA では、身元を確認すると身元を保証する署名済みのサーバー証明書(Server Certificate)を作成し、要求元に届けます。サイトの管理者は、取得したサーバー証明書を Apache の所定のディレクトリに保存します。Turbolinux 11 Server の初期設定では、/etc/pki/tls/certs/localhost.crt ファイルとして保存します。

自己署名証明書(/etc/pki/tls/certs/localhost.crt)の生成

自己署名証明書を作成し、セキュアサーバーが正常に動作するかどうかを確認します。生成した サーバー証明書要求(localhost.csr)を使用して、自分で自己署名証明書(localhost.crt)を生成します。Turbolinux 11 Server にはあらかじめ、ダミーの自己署名証明書が用意されています。必要な場合はバックアップをとってから実行してください。以下のコマンドを実行します。

# cd /etc/pki/tls/certs
# mv localhost.crt localhost.crt_org
# openssl x509 -req -signkey ../private/localhost.key -days 365 -in ../csr/localhost.csr -out localhost.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Shibuya/O=Mycompany/OU=Doc/CN=example.com/emailAddress=taro@example.com
Getting Private key
Enter pass phrase for ../private/localhost.key: ←秘密鍵のパスフレーズ

秘密鍵(localhost.key)生成時に入力したパスフレーズを入力をします。自己署名証明書が、/etc/pki/tls/certs/localhost.crt として生成されます。

9.22.2. Apache の起動と接続確認

ティップ

mod_ssl モジュールのロードや秘密鍵、証明書のパス指定など必要な指定は、/etc/httpd/conf.d/ssl.conf に記述されています。詳細は 項9.22.3 を参照してください。

設定完了後、apache を再起動します。

# /etc/init.d/httpd restart
Stopping httpd:                                                           OK
Starting httpd: Apache/2.2.6 mod_ssl/2.2.6 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server www.example.com:443 (RSA)
Enter pass phrase: ←秘密鍵のパスフレーズ

Ok: Pass Phrase Dialog successful.
                                                                          OK

秘密鍵を復号するために、httpd の起動時にパスフレーズの入力を求められます。秘密鍵の生成時に入力したパスフレーズを入力します。

Web ブラウザから mod_ssl が正常に機能していることを確認します。https://www.exsample.com/ のように入力して Web サーバーへアクセスします。"https" であることに注意してください。

CA から署名された証明書であればブラウザは自動的にその証明書を受け入れます。自己署名証明書を検出した場合はブラウザは受け入れを確認するダイアログを表示しますので、ブラウザの指示に従ってください。以下は、Mozilla Web ブラウザの例です。その後、Webページが表示されれば、mod_ssl は正常に動作しており、通信は暗号化されています。

9.22.3. ssl.conf ファイル

Apache では、SSL による暗号化通信機能が mod_ssl モジュールにより提供されています。Turbolinux 11 Server の Apache では、初期状態で /etc/httpd/conf.d/ssl.conf ファイルがあり、httpd.conf ファイルより読み込まれて有効になっています。このファイルには、以下の例のように必要な設定が記述されており、モジュールのロードや SSL 機能の有効化、SSL 通信で使用する標準のポート番号 443 の Listen やその他の必要な設定が既に行われています。<VirtualHost _default_:443> から </VirtualHost> の間は、443 ポートへのアクセスを処理するバーチャルホストとしての設定が行われています。環境に合わせてファイルを編集して利用することが可能です。以下は、初期状態のファイルのコメント部分を割愛したものです。他にも関連するディレクティブや説明がコメントとして多数記述されています。

LoadModule ssl_module modules/mod_ssl.so
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>

関連する主なディレクティブを以下に解説します。

SSLPassPhraseDialog type

Apache 起動時に暗号化された秘密鍵のパスフレーズを入力する方法を指定します。builtin がデフォルトで、ダイアログが表示され管理者はパスフレーズを入力します。exec:program_path に暗号化パスフレーズのための外部プログラムを指定することもできます。

SSLSessionCache type

SSL セッションの保持するキャッシュに関する設定です。none (キュッシュは無効)、dbm:file_path(ローカルディスク上の DBM にキャッシュ)、shm:file_path[size](RAM の共有メモリ上のハッシュテーブルにキャッシュ)を指定します。

SSLSessionCacheTimeout seconds

SSL キャッシュ格納がタイムアウトするまでの時間を秒単位で指定します。

SSLMutex type

複数起動している httpd プロセス間の排他制御を行う方法を指定します。none または no (排他制御なし)、file:file_path(ロックファイルとして file_path を使用)、flock:file_path(flock() 関数使用)、fcntl:file_path(fcntl() 関数使用)、sysvsem(SystemV IPC セマフォを使用)、sem(セマフォを使用)、pthread(Posix thread を使用)、default (システムでデフォルトのロック機構を使用)の指定が可能です。

SSLRandomSeed context source [bytes]

PRNG(暗号で使用する疑似乱数ジェネレータ)に関する設定です。 context には、startup(OpenSSL の開始時)または、connect(新しいコネクションの確立時)を指定します。source には、乱数生成の元を builtin 、file:path_to_source、exec:program で指定します。

SSLEngine On|Off

SSLの有効(On)/無効(Off)を切り換えます。

SSLCipherSuite cipher-spec

:(コロン)で区切ってサポートする暗号方式を ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP のように指定します。

SSLCertificateFile file-path

秘密鍵ファイルのパス指定です。秘密鍵については 項9.22.1を参照してください。

SSLCertificateKeyFile file-path

サーバー証明書ファイルのパス指定です。サーバー証明書については 項9.22.1を参照してください。

SSLOptions [+|-]option ...

SSL のオプションをディテクトリ単位に指定します。+ や - の符号は、親ディレクトリの設定を変更するときに使用します。+ の符号は親ディレクトリの設定に追加され、- の符号は親ディレクトリの設定から削除されます。符号の指定がない場合は、指定したオプションで親ディレクトリの設定を置き換えます。オプションは複数指定が可能で、StdEnvVars(SSL に関する標準の CGI/SSI 環境変数作成)、CompatEnvVars(Apache SSL 互換のための CGI/SSI 環境変数作成)、ExportCertData(X.509 認証に関する CGI/SSI 環境変数作成)、FakeBasicAuth(X509 認証の DN で Apache のベーシック認証を許可)、StrictRequire(mod_ssl でアクセス拒否時に Satisfy Any は無効)、OptRenegotiate(SSL コネクションの再ネゴシエーションの最適化)が有効です。