SSL(安全なApache)の設定方法(Red Hat Linux 9)



 SSLとはSecure Socket Layer の略で、暗号化された安全な通信を提供します。

概要
 SSLは簡単に言うと、データを暗号化してやり取りするやり方の決まりです。SSLを使用すると、送信するデータが暗号化されるので、プライバシーに関わる情報を第三者に見られずにやり取りすることができます。

暗号の必要性
 インターネットでは現在使用されている通信手段には、元々は暗号化の仕組みがありませんでした。そのため、悪意と技術を持った第三者が容易に中身を覗くことができます。インターネットは多くのネットワークを接続した巨大ネットワークですから、その中での通信はいくつものネットワークを経由して送られます。通信相手が遠ければ遠いほど中継するネットワークの数が増えます。自分が全く知らないところを通ることも少なくありません。そうなってくると、通信の内容を覗き見される可能性も次第に増えていきます。インターネットはどこにどんな人がつながっているかわかりませんから、プライバシーに関する情報などを送る場合には用心したほうが良いわけです。

安全性
 絶対に不正解読不能な暗号というのは存在しません。もちろん、暗号文を正しく復号するには正しい鍵を知る必要がありますが、鍵の種類は有限なので、すべての鍵を順に試して行けばいつか必ず正しい鍵にたどり着けます。
 しかし、正しい鍵にいき着くまでに非常に長い時間(たとえば1000年)かかるなら、暗号の目的は十分達成できることになります。

SSLを使うには
 Netscape CommunicatorやInternet Explorerなど、SSLに対応したブラウザがあればOKです。SSLを使うために特別の設定をする必要はありません.対応しているブラウザを使っていれば、デフォルトの設定のままで必要なときには自動的にSSLが使われます。

Firewallの設定
 SSLはTCPのポート443を使いますので、このポート宛のパケット、およびこのポートからのパケットを通すように設定してください。

Microsoft Internet Explorer 5.00以前のバージョンをご利用の方(ルート証明書を使用している場合)
 Microsoft Internet Explorer 5.00以前のバージョンをご利用の場合、SSLを使用してログインしようとする場合に、証明書の期限が切れている旨のメッセージが表示される問題が発生する場合があります。詳細は以下ををご覧ください。

SSL証明書の期限切れに関する問題について

 Microsoft Internet Explorer 5.00以前のバージョンをご利用の方へ。
 (この問題はInternet Explorer 5.01以降のブラウザを使用している場合には発生しません)

SSLを使用してログインしようとする場合に、証明書の期限が切れている旨のメッセージが表示される問題が発生する場合があります。これは、IE5.00以前のブラウザにあらかじめ組み込まれているVerisign社のルート証明機関の証明書が古いために発生します。

そのようなメッセージが表示された場合には、以下のいずれかの方法で回避することができます。 この問題に関する詳しい情報はVerisign社のページでご確認ください。
http://www.verisign.co.jp/server/cus/rootcert/2028pca3.html


●SSLの導入

 名前ベースのバーチャルホストはSSLプロトコルの特徴により、SSL セキュアサーバには使えません。

バージョン1.3のApacheまでは、SSLを利用するためにはApache本体にパッチを当てる必要がありました。また、SSLの設定もhttpd.confファイルに記載されていたため、SSLを利用するにはhttpd.confファイルを修正しなければなりませんでした。
 しかし、バージョン2.0のApacheでは、Apache本体に手を加えなくても、モジュールmod_sslを利用すればSSLを利用することが出来るようになりました。また、SSLの設定もssl.confに記述されるようになったため、httpd.confを修正しなくてもSSLの設定を行うことが出来るようになりました。
 なお、Red Hat Linuxでは、インストールした段階でSSLに必要な証明書等がインストールされていて、そのままの状態でSSLを利用することが出来るようになっています。しかし、今回は独自の証明書等を作成する方法から説明します。

●証明書の作成

 SSLを利用するためには、まずWWWサーバの公開鍵と証明書の作成を行う必要があります。証明書は当然ながら正規の認証局(CA)が発行したものを利用することが出来ますが、ここでは独自に作成した証明書を利用することにします。なお、このように独自に作成した証明書を利用する場合でも、サーバとクライアントの間の通信を暗号化出来るという利点があります。

 なお、Red Hat Linuxでは、証明書の作成はApacheのServerRootとして指定されるディレクトリの相対パスで、conf/以下で行います。つまり、デフォルトの設定では、/etc/httpd/conf/で行うことになります。

●サーバ鍵の作成

 証明書を作成するには、まず、サーバが利用する鍵を作成する必要があります。まず、インストールの段階で作成されている鍵を削除する必要があります。
  # rm ssl.key/server.key
  # rm ssl.crt/server.crt
 次に、鍵の作成を行います。
  # make genkey
 このコマンドを実行すると、以下のような反応が返ってきて、
  umask 77 ; \
  /usr/bin/openssl genrsa -des3 1024 > /etc/httpd/conf/ssl.key/server.key
  Generating RSA private key, 1024 bit long modulus
  ....++++++
  ....++++++
  e is 65537 (0x10001)
  Enter pass phrase:
パスフレーズ入力プロンプトとなります。これは、以下のコマンドを実行するのと同じことです。
  # /usr/bin/openssl genrsa -des3 1024 > /etc/httpd/conf/ssl.key/server.key
 これは、秘密鍵をトリプルDESで作成する標準(推奨)となっています。このとき要求されるパスフレーズは、鍵の秘密鍵を暗号化するために利用されます。パスフレーズが条件に満たされていない場合、以下のように表示されたり(実際は一行)
  5932:error:28069065:lib(40):UI_set_result
            :result too small:ui_lib.c:847:You must type in 4 to 8191 characters
パスフレーズが一致していないと、以下のように表示されたりしますので注意してください。
  Verify failure
  User interface error
  5932:error:0906906F:PEM routines:PEM_ASN1_write_bio:read key:pem_lib.c:327:
  make: *** [/etc/httpd/conf/ssl.key/server.key] エラー 1
しかし、このコマンドを利用して鍵を作成すると、Apacheを起動するたびに鍵のパスフレーズを入力する必要があります。パスフレーズの入力を行わなくてもよいRSAの鍵を作成するには、以下のコマンドを実行します。1024は1024bitの鍵を作成することを明示的に示しています。何も記載しないと512bitの鍵(デフォルト)が作成されます。
  # /usr/bin/openssl genrsa 1024 > /etc/httpd/conf/ssl.key/server.key
 どちらかのコマンドを実行することで、サーバの鍵が/etc/httpd/conf/ssl.key/server.keyとして作成されます。次に、サーバの鍵をroot以外が読めないようにします。
  # chmod 400 ssl.key/server.key
以上で、サーバの鍵の作成は終了です。

●サーバの証明書(自署証明書)の作成

 CAの署名した証明書を入手しようとしているなら、サーバの証明書(自署証明書)を作る必要はありません。
 サーバの証明書(自署証明書)を作成するには、以下のコマンドを実行します。
  # make testcert
すると、以下のような反応が返ってきます。

 一回でもサーバの証明書(自署証明書)を作成したことがある場合は
  # /usr/bin/openssl req -new -key /etc/httpd/conf/ssl.key/server.key \
                            -x509 -days 365 -out /etc/httpd/conf/ssl.crt/server.crt
と入力してください。
  umask 77 ; \
  /usr/bin/openssl req -new -key /etc/httpd/conf/ssl.key/server.key \
                            -x509 -days 365 -out /etc/httpd/conf/ssl.crt/server.crt
  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) [GB]:JP    ・・・・・・・・・・・・・・・・・・・・・
  State or Province Name (full name) [Berkshire]:Hokkaido    ・・・・・・・・・・・・
  Locality Name (eg, city) [Newbury]:Asahikawa-si    ・・・・・・・・・・・・・・・・
  Organization Name (eg, company) [My Company Ltd]:DOSANKO   ・・・・・・・・・・・・
  Organizational Unit Name (eg, section) []:.    ・・・・・・・・・・・・・・・・・・
  Common Name (eg, your name or your server's hostname) []:dosanko.hokkaido.co.jp ・・・
  Email Address []:webmaster@hokkaido.co.jp    ・・・・・・・・・・・・・・・・・・・
  • Country NameではWWWサーバを設置する国名をアルファベット2文字で設定します。
     日本の場合“JP”となります。
  • State or Province NameではWWWサーバを設置する地域名を設定します。
     日本の場合都道府県名を設定します。
  • Locality NameではWWWサーバを設置する都市名を設定します。
  • Organization NameではWWWサーバを設置する組織名を設定します。
     会社名などを利用します。
  • Organizational Unit NameではWWWサーバを設置する組織の部門名を設定します。
     会社組織などでは部課名を利用します。
  • Common NameではWWWサーバの名前をFQDNで入力します。
     DNSに登録されているFQDNを必ず入力します。
  • Email AddressではWWWサーバの管理者の電子メールアドレスを設定します。
  • 不要な項目には“.”を入力します。
 上記の入力が完了したら、新しいサーバの証明書(自署証明書)を有効にするためhttpdを再起動してください。

●SSLの設定

 SSLの対応したApacheの動作設定には、ssl.confを利用します。ssl.confは/etc/httpd/conf.d/以下に保存されています。httpd.confによってssl.confの中がApacheの設定ファイルとして読み込まれるようになっています。ssl.confの中で、SSLに関連する設定項目を以下に示します。

SSLRequire
 このディレクティブを利用することで、クライアントからのアクセスのうち、SSLを使用しないアクセスが禁止されます。

SSLEngine On|Off
 SSLを利用するか否かを指定します。“On”を指定した場合にはSSLを使用します。“Off”を指定した場合はSSLを使用しません。Red Hat Linuxではデフォルトでは“On”となっていて、SSLを利用する設定となっています。SSLを利用しない場合には、ここには“Off”を指定してください。

SSLCertificateFile <filename>
 <filename>に証明書ファイルをフルパスで指定します。Red Hat Linuxでのデフォルトの設定は、/etc/httpd/conf/ssl.crt/server.crtとなっています。

SSLCertificateKeyFile <filename>
 <filename>にサーバの鍵ファイルをフルパスで指定します。Red Hat Linuxでのデフォルトの設定は、/etc/httpd/conf/ssl.key/server.keyとなっています。

SSLCertificatePath <filename>
 <directory>に認証局が発行した証明書を保存するディレクトリを指定します。Red Hat Linuxでのデフォルトの設定は、コメント行となっています。

SSLVerifyClient <level>
 WWWサーバにアクセスするクライアントの証明書を利用するかどうかを指定します。<level>に設定する値によって、クライアントの証明書の利用方法を指定します。<level>に設定する値と、その意味について以下に示します。

<level> 意味
none クライアント証明書を利用しない。
optical 認証局が発行したクライアントの証明書を利用することが出来るが、必須とはしない。
Require 認証局が発行したクライアントの証明書を要求する。
optical_no_ca クライアントの証明書を利用することが出来るが無効な証明書でも認める。

 通常SSLを利用する場合には、WWWサーバの認証のみを行うので“none”を指定します。“optical”または“Require”を利用する場合には、認証局の発行したクライアントの証明書はSSLCACertificatePathディレクティブで指定したディレクトリに保存します。

SSLVerifyDepth <depth>
 認証局がはっこうしたの証明書を利用する場合、証明書を発行した認証局の認証パスをたどる場合の深さの最大値を、lt;depth>に設定します。WWWサーバの認証のみを行う場合には利用せず、SSLVerifyDepthディレクティブを利用しない場合にはlt;depth>に“0”が指定されているのと同様になります。

SSLOptions+FakeBasicAuth
 クライアントの署名書を使った認証と、Basic認証を使ったユーザ認証を組み合わせて利用する場合、クライアントの証明書のDN(Distinguished Name)をBasic認証のユーザ名として利用します。

SSLPassPhradeDialog [builtin|exec:<filename>]
 WWWサーバの共通鍵暗号アルゴリズムの秘密鍵で利用する、パスフレーズの入力方法を指定します。“builtin”を指定した場合、パスフレーズを入力するプロンプトが画面に表示されます。“exec”を指定した場合、<filename>にプログラムのパス名を指定します。プログラムにはWWWサーバの“ホスト名:ポート番号”を入力するとパスフレーズを出力するものを利用します。

SSLMutex <type>
 複数のhttpdがあるとき、httpdプロセス間で同期を取るときの排他的制御の方法を指定します。<type>に指定する値と、そのときの同期の取り方を以下に示します。

<type> 同期
none 排他的制御を行わない。
file:<filename> ロックファイルによって排他制御を行う。<filename>にロックファイルのパスを指定する。
sem SysV UPC Semaphoreによって排他制御を行う。

SSLSessionCacheTimeout <time>
 SSLセッションをキャッシュする有効期間を<time>に秒で指定します。