UnixPower on Networking
  http://www.unix-power.net/

 
 Top - Linux - CentOS Apache+OpenSSLでセキュア・サーバ




■OpenSSLのインストール


個人情報がうるさく言われる現在、SSLで暗号化をかけることはよくあります。ベリサインなどの認証局などで発行される証明書は有料となりますので自分で署名する自己証明書でSSL暗号化をかけてみます。まず必要なモジュールをインストールします。


# yum install mod_ssl
# rpm -qa | grep mod_ssl
mod_ssl-2.2.15-26.el6.centos.i686


まず最初にopenssl.cnfファイルを編集しサーバ証明書の有効期限に関する設定を行っておきます。


# vi /etc/pki/tls/openssl.cnf

default_days    = 3650                  # how long to certify for


秘密鍵を作成するための乱数ファイルを作成します。下記では/var/log/messagesを指定しています が、/etc/*としてもOKですし何でもOKだと思います。


# cd /etc/pki/tls/
# openssl md5 /var/log/messages* > rand.dat
# more rand.dat
MD5(/var/log/messages)= 3fa5d6631735bf840daa82e0113700a3
MD5(/var/log/messages-20121006)= 3673d2a78a983490f6aa729ba4653538
MD5(/var/log/messages-20121007)= 528346d6e271aca6c3b963989a1c6926
MD5(/var/log/messages-20121014)= c0c0d7a10a03f67272ad2a0979203d74
MD5(/var/log/messages-20121118)= d37fced7395f3ea53ce18514a8d90f39


乱数ファイルができましたのでこれを用いて秘密鍵を作成します。


# openssl genrsa -rand rand.dat -des3 2048 > ./private/test.key
321 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
...........+++
...........................+++
e is 65537 (0x10001)
Enter pass phrase: [パスワード入力] Verifying - Enter pass phrase:[再度パスワード入力]


上記にて秘密鍵ができましたので、これを用いて証明書発行要求(Certificate Signing Request)を作成します。


#  openssl req -new -key ./private/test.key -out ./test.csr
Enter pass phrase for /etc/pki/tls/private/test.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) [XX]:JP State or Province Name (full name) []:Kagawa Locality Name (eg, city) [Default City]:Takamatu-shi Organization Name (eg, company) [Default Company Ltd]:Hogehoge Organizational Unit Name (eg, section) []:Tech Common Name (eg, your name or your server's hostname) []:www.unix-power.net Email Address []:webmaster@unix-power.net Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: [何も入力しない] An optional company name []:[何も入力しない]


上記でCSRが作成されましたので今度はこれを用いて証明書を発行します。有効期限は任意に決めることができますが下の例では10年にしています。


# openssl req -x509 -days 3650 -in test.csr -key private/test.key -out ./test.crt
Enter pass phrase for private/test.key:[秘密鍵のパスフレーズを入力]


これでWebサーバに設定する秘密鍵および証明書が作成されましたのでこれをApacheに組み込みます。編集するファイルは/etc/httpd/conf.d/ssl.confになります。


# vi /etc/httpd/conf.d/ssl.conf

# 証明書ファイルの指定
SSLCertificateFile /etc/pki/tls/test.crt
# 秘密鍵ファイルの指定
SSLCertificateKeyFile /etc/pki/tls/private/test.key
# ベリサインなどを利用する際は下記の中間証明書を設定する必要あり
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt


あとはapacheを起動すればhttpsが起動しますが、起動の際に秘密鍵のパスフレーズを聞かれます。セキュリティ上の観点からはこのままでも良いのですが都度入力するのが面倒くさい場合は以下のコマンドで外すことも可能です。


# openssl rsa -in private/test.key -out private/test-nopass.key
# vi /etc/httpd/conf.d/ssl.conf
SSLCertificateKeyFile /etc/pki/tls/private/test-nopass.key

その他、SSL関連の設定項目を以下に記載します。

SSLRequireSSL

SSLRequireSSLを指定するとSSLを使用しないアクセスが禁止されます。

SSLEngine On | Off

SSLを利用するか否かを指定します。Onを指定した場合はSSLを使用します。Offを指定した場合はSSLを使用しません。

SSLVerifyClient <level>

クライアントの証明書を確認するかどうか指定します。<level>に設定する値によって確認方法が異なります。<level>に設定する値とその意味を以下に示します。

<level> 意味 
none クライアントの証明書を確認しない
optional 認証局が発行したクライアントの証明書を確認するが必須とはしない
require 認証局が発行したクライアントの証明書を要求する
optional_no_ca クライアントの証明書を確認するが無効な証明書でも認める。

通常、SSLを利用する場合にはWebサーバの認証のみ行うためのnoneを指定します。optionalまたはRequireを利用する場合にはクライアント側の証明書が必要となります。

SSLVerifyDepth <depth>

認証局が発行したクライアントの証明書を確認する場合、証明書を発行した認証局の認証パスを辿る深さの最大値を<depth>で指定します。0を指定すると認証局を介さない自己証明書を許可します。

SSLOptions FakeBasicAuth

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

SSLPassPhraseDialog [ builtin | exec:<filename> ]

サーバの秘密鍵ファイルを開くときに必要となるパスフレーズの入力方法を指定します。builtinを指定した場合、パスフレーズを入力するプロンプトが画面に表示されます。execを指定した場合、<filename>にプログラムのパス名を指定します。引数にホスト名:ポート番号を指定されるため、それに対応したパスフレーズを標準出力するプログラムを指定します。

SSLMutex <type>

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

<type> 同期
none 排他制御を行わない。noを指定しても同等の効果となる。
file:<filename> ロックファイルによって排他制御を行う。<filename>にロックファイルのパスを指定する。
default プラットフォームとAPR ( Apache Portable Runtime )が指定した排他制御の仕組みを利用する。

SSLSessionCacheTimeout <time>

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

SSLは通常443番を待ち受けているバーチャルサーバという形で実現されます。このためSSLに対する設定の他、SSLサーバに関する設定が必要となります。以下、デフォルトでインストールされているhttpd.confのSSLに関連する設定ファイルの抜粋です。

# vi /etc/httpd/conf.d/ssl.conf

Listen 443
<VirtualHost _default_:443>
#DocumentRoot "/var/www/html"
#ServerName www.example.com:443

SSLEngine on

</VirtualHost>



 
 関連記事
 Apacheのチューニング
 Apache+OpenLDAPで認証設定
 Awstatsのインストール
 Copyright(C) 2003-2015 UnixPower on Networking All rights reserved.