印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
Linux Apache を SSL 対応に

自宅サーバで非公開のウェブログを運用している場合、.htaccess を設置することでアクセスの制御ができる。しかし、通信内容は暗号化されていないので不安が残る。そこで Apache を SSL に対応させ、必要に応じてセキュアな通信ができるように設定する。ただし、通信がセキュアであってもパソコンのローカルディスクに暗号化なしでキャッシュされてしまうのは避けられないので、外部からのアクセスには注意が必要なことは変わらない。

■ ■ ■

Apache の SSL 対応についての詳しい説明は、@IT - SSLによる安全なWebサイト作り有限会社フューチャーウェイブ - ApacheによるSSLサーバの構築 に譲ることにして、ここでは Vine Linux 2.6 におけるインストールと設定に焦点を当てることにする。

すべてを理解できていないが、今のところこれで動いている。認証局と Web サーバが同じマシンで動いているので少々混乱するが、何とかいける。

途中、秘密鍵用と公開鍵用のパスフレーズの入力が求められる。このパスフレーズは何でもよく、作成したら忘れてしまってよい。後で使うことはない。

環境は次の通り。

  • VineLinux 2.6
  • Apache 1.3.27
  • OpenSSL 0.9.6m
  • mod_ssl 2.8.12

まず OpenSSL パッケージがインストールされているかを確認する。

$ rpm -qa | grep openssl
openssl-devel-0.9.6m-0vl0.26
openssl-0.9.6m-0vl0.26

デフォルトでは、mod_ssl はインストールさない。apt-get で mod_ssl をネットワークインストールする。

# apt-get install mod_ssl

mod_ssl 2.8.12-0vl3 がインストールされた。鍵関係のディレクトリは /etc/httpd/conf に作成され、鍵のサンプルファイルも作られるので、httpd.conf を編集すれば鍵作成の手間は要らないように思える。しかし、それでは自分で認証局を作る意味がないので、そのサンプルファイルは使わない。

さて、@IT - SSLによる安全なWebサイト作り によれば、設定するには openssl コマンドと CA.sh スクリプトが必要とある。CA.sh が見つからないので探してみると、CA という名前でインストールされていた。

$ rpm -ql openssl | less
...
/usr/bin/openssl
...
/usr/share/ssl/misc/CA
...

OpenSSL を設定するためのディレクトリを作り、スクリプトをコピーする。

# mkdir /usr/local/ssl
# cp /usr/share/ssl/misc/CA /usr/local/ssl

準備ができたので、実際の設定に入る。

認証局 (CA) を自前で作成する。OpenSSL の動作はインストールディレクトリのコンフィグレーションファイル /usr/share/ssl/openssl.cnf によって制御される。開いてみると、認証局用のディレクトリはカレントディレクトリ以下に ./demoCA として作成されるようになっているので、/usr/local/ssl に移動しておく。

# cd /usr/local/ssl
# ./CA -newca
CA certificate filename (or enter to create) (入力不要)

Making CA certificate ...
Using configuration from /usr/share/ssl/openssl.cnf
Generating a 1024 bit RSA private key
.++++++
..........................++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase: (秘密鍵用パスフレーズを入力)
Verifying password - Enter PEM pass phrase: (秘密鍵用パスフレーズを再入力)
-----
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 nlog(n).
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) []:(必要であれば入力)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:nlog(n)
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:nlogn.ath.cx
Email Address []:n@nlogn.ath.cx

これで認証局の証明書と認証局の秘密鍵ができる。

次に公開鍵を作成する。乱数生成のための種になるファイルとしては、ある程度の容量があれば何でもよいので、ここでは先ほど自動的に作られた demoCA ディレクトリの中にある鍵ファイル cacert.pem を指定している。

# /usr/bin/openssl genrsa -rand ./demoCA/cacert.pem -des3 -out serverkey.pem 1024
1107 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
............++++++
...............................................++++++
e is 65537 (0x10001)
Enter PEM pass phrase: (公開鍵用パスフレーズを入力)
Verifying password - Enter PEM pass phrase: (公開鍵用パスフレーズを再入力)

このままだと、Apache 起動時に毎回パスフレーズの問い合わせがあるので、serverkey.pem に鍵を埋め込むことでパスフレーズを解除する。セキュリティは落ちるが、ここは利便性を優先する。

# /usr/bin/openssl rsa -in serverkey.pem -out serverkey.pem
read RSA key
Enter PEM pass phrase: (公開鍵用パスフレーズを入力)
writing RSA key

認証局への申請書 (CSR) を作成する。これを使って自分のサーバ宛に申請することになる。作成には公開鍵を使う。

# /usr/bin/openssl req -new -days 365 -key serverkey.pem -out csr.pem
Using configuration from /usr/share/ssl/openssl.cnf
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 nlog(n).
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) []:(必要であれば入力)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:nlog(n)
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:nlogn.ath.cx
Email Address []:n@nlogn.ath.cx

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

証明書を作成する。

# /usr/bin/openssl ca -in csr.pem -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out cert.pem
Using configuration from /usr/share/ssl/openssl.cnf
Enter PEM pass phrase:(最初に作った秘密鍵のパスフレーズを入力)
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Tokyo'
organizationName      :PRINTABLE:'nlog(n)'
commonName            :PRINTABLE:'nlogn.ath.cx'
emailAddress          :IA5STRING:'n@nlogn.ath.cx'
Certificate is to be certified until May 23 05:44:11 2005 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

SSL を使うための Apache の設定を行う。/etc/httpd/conf/httpd.conf を編集して,ポート番号 443 でアクセスされた場合のバーチャルホスト設定を追加する。

<IfDefine HAVE_SSL>
NameVirtualHost *:443
Listen 443
<VirtualHost *:443>
ServerName nlogn.ath.cx
ServerAdmin n@nlogn.ath.cx
DocumentRoot /home/path-to-documentroot/nlogn
SSLEngine on
SSLCertificateFile /usr/local/ssl/cert.pem
SSLCertificateKeyFile /usr/local/ssl/serverkey.pem
<Files ~ "\.(cgi|shtml)$">
    SSLOptions +StdEnvVars
</Files>
<Directory /home/path-to-documentroot/nlogn>
    SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog /var/log/httpd/nlogn_ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
  # 他にバーチャルホストがあれば
  <VirtualHost *:443>
  他のバーチャルホストの設定
  </VirtualHost>
</IfDefine>

コンフィグレーションファイルが正しいかチェックして、問題がなければリスタートする。

# /etc/init.d/httpd configtest
Syntax OK
# /etc/init.d/httpd restart

VineLinux 2.6 の Apache 起動スクリプト /etc/init.d/httpd は,次のように動作する。

  • /usr/lib/apache ディレクトリをチェックし、モジュールをリストアップする
  • モジュールが存在する場合「HAVE_モジュール名」を有効にして httpd を起動する

したがって、apachectl で指定するような SSL 組み込みオプションは必要ない。逆に言えば、mod_ssl モジュールがインストールされていた場合は自動的に組み込まれてしまう。mod_ssl はメモリを大量に消費するので、必要がない場合はアンインストールしてしまった方がよい。

自宅ネットワークでの接続に成功したら、ADSL モデム・ルータでポート番号 443 をポートマッピングすれば外部からの接続が可能になる。

2005年4月4日追記:
Vine Linux 3.1 の場合は,パッケージのバージョンが異なるだけで,同様の手順で設定を行うことができます(nlog(n): SSL の設定)。

2006年5月23日追記:
上記は,いわゆる「オレオレ証明書」の作成方法です (nlog(n): オレオレ証明書を更新)。

Posted by n at 2004-05-23 23:08 | Edit | Comments (1) | Trackback(2)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
SSLの証明書を作成する
我が家のWebサーバで、Basic認証を使用するのにSSLを使用しています。 主 Trackbacked from: ひろちゃん帝国 ココログ村 at November 04, 2006 02:00
SSLの証明書を作成する
我が家のWebサーバで、Basic認証を使用するのにSSLを使用しています。 主 Trackbacked from: ひろちゃん帝国 ココログ村 at April 18, 2008 00:04
Comments

SSLの証明書の有効期限が切れてしまい、証明書の作り方を探していたらたどり着きました。
私んちのWebサーバと同じVineLinux2.6の環境だったので、大変参考になりました。
ありがとうございます。
記事内でリンク&トラックバックさせていただきました。

もうすぐVineLinux4のリリースですね!

Posted by: ひろちゃん at November 04, 2006 02:06
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?