ようこそNICのホームページへ(なが〜い試運転中)    あなたは2001/5/12以来 人目の来訪者です。
HP パソコン 健康 落語 海外 思うまま 電子工作


Apache2でSSL+BASIC認証を使う(2009/01/15)
Last update:2009/01/25  build:2009/01/15




0 前段のおはなし

HTTPSを導入したい、と思うようになった(2009/01/10)。 Apache2にsslを導入しHTTPS対応としたい。 ここの記述によると、 apache2にはportsから導入すると自動的にsslが導入されているとのこと。 あるいは、明示的にwith_out=ssl としない限りsslが導入されているとのこと。 あとは、鍵の作成程度でhttpsが使えるようになるとのこと。 一応、sslが導入されていると言う前提で、鍵の作成をやってみた。しかしうまくいかない。 apache2を止めてsslで再スタートさせHTTPのプロセスを拾ってみる。
VersaPro# /usr/local/apache2/bin/apachectl stop 
VersaPro# /usr/local/apache2/bin/apachectl  startssl
VersaPro# ps -ax |grep http
50264  ??  Ss     0:00.56 /usr/local/apache2/bin/httpd -k start -DSSL
50265  ??  I      0:00.02 /usr/local/apache2/bin/httpd -k start -DSSL
50266  ??  I      0:00.01 /usr/local/apache2/bin/httpd -k start -DSSL
50267  ??  I      0:00.01 /usr/local/apache2/bin/httpd -k start -DSSL
50268  ??  I      0:00.01 /usr/local/apache2/bin/httpd -k start -DSSL
50269  ??  I      0:00.01 /usr/local/apache2/bin/httpd -k start -DSSL
50274  p0  R+     0:00.00 grep http
VersaPro# pwd
SSLで走ってはいるような??
ポート443をListenしているか調べてみる。
VersaPro# netstat -atn
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp46      0      0  *.80                   *.*                    LISTEN
tcp4       0      4  192.168.0.52.23        192.168.0.2.1104       ESTABLISHED
tcp4       0      0  *.110                  *.*                    LISTEN
tcp4       0      0  *.23                   *.*                    LISTEN
tcp4       0      0  *.22                   *.*                    LISTEN
tcp4       0      0  *.21                   *.*                    LISTEN
tcp4       0      0  127.0.0.1.25           *.*                    LISTEN
udp4       0      0  127.0.0.1.123          *.*                    
udp6       0      0  fe80:4::1.123          *.*                    
udp6       0      0  ::1.123                *.*                    
udp4       0      0  192.168.0.52.123       *.*                    
udp6       0      0  fe80:1::210:a4ff.123   *.*                    
udp6       0      0  *.123                  *.*                    
udp4       0      0  *.123                  *.*                    
udp4       0      0  *.514                  *.*                    
udp6       0      0  *.514                  *.*                    
Active UNIX domain sockets
Address  Type   Recv-Q Send-Q    Inode     Conn     Refs  Nextref Addr
c24e2000 stream      0      0 c24d1660        0        0        0 /var/run/devd.pipe
c24e1460 dgram       0      0        0 c24e1e38        0 c24e17a8
c24e17a8 dgram       0      0        0 c24e1e38        0 c24e1d20
c24e1c94 dgram       0      0        0 c24e1ec4        0        0
c24e1d20 dgram       0      0        0 c24e1e38        0 c24e1dac
c24e1dac dgram       0      0        0 c24e1e38        0        0
c24e1e38 dgram       0      0 c24e6110        0 c24e1460        0 /var/run/logpriv
c24e1ec4 dgram       0      0 c24e6220        0 c24e1c94        0 /var/run/log


443が表示されない。 どうもsslがうまく動いていないようだ。
いろいろ調べてみると、Apache2の場合portsで導入すると初めからsslが自動で導入されるようだ。
自分はfreebsd 6.1ベースのapache2 2.0.59である。

導入はソースファイルをダウンロードして、コンパイルしたもの。 portsではない。たしかに、初めに参照したページにもportsで導入すればとある。 モジュールとして mod_ssl.c が導入されているかどうかは httpd -l で確認可能という。このコマンドを実行して mod_ssl.c が表示されなければ、再度、コンパイルして導入し直す必要がある。
実行してみた
VersaPro# bin/httpd -l
Compiled in modules:
  core.c
  mod_access.c
  mod_auth.c
  mod_include.c
  mod_log_config.c
  mod_env.c
  mod_setenvif.c
  prefork.c
  http_core.c
  mod_mime.c
  mod_status.c
  mod_autoindex.c
  mod_asis.c
  mod_cgi.c
  mod_negotiation.c
  mod_dir.c
  mod_imap.c
  mod_actions.c
  mod_userdir.c
  mod_alias.c
  mod_so.c
無いようだ。再コンパイルしないとだめだろう。


(2009/01/16 追記)  ここからは、通常のapache2のインストールとBASIC認証についての自己メモです。 サーバーにしている機種は今までどおりのVersaPro VA70J/WXAです。
途中に出てくる(○分○秒)はこの機種での概略の作業時間です。
VersaPro VA70J/WXA: M Pentium 3 700MHz Memoey 256MB HDD 20GB
(2009/03/01 追記)
Floraにもapache2をインストールした。{ }内はFloraでの作業時間
(2009/03/01 追記 ----- ここまで -----)
Apache 2.0.59をダウンロード

1 apache2+SSLのソースからのインストール

0) 念のために今のapache2をフォルダーごとバックアップする
   フォルダーの名前を変えて保存する。
   mv apache2 apache2-old
1) /usr/local/の下にsource/apacheディレクトリーをつくりここにapache2のソースをいれる。
2)圧縮ファイルを展開 /usr/local/source/apache にフォルダーを移す
cd /usr/local/source/apache
 ファイルの展開
  tar zxvf httpd-2.0.59.tar.gz
 httpd-2.0.59 フォルダーができる
3) フォルダ移動 httpd-2.0.59 フォルダーに移動
 cd httpd-2.0.59
4) コンパイルの準備 ここでsslモジュールを入れる
./configure --enable-ssl (約1分49秒){約1分22秒} <−−−−ここが肝心です
5)コンパイル
make  (約6分11秒){約5分20秒}
6)インストール
 make install (約12秒){約7秒}
 /usr/local/apache2 にインストールされる
7)フォルダ移動
 cd /usr/local/apache2
8)confファイルの編集
 cd conf
 httpd.confは変更無し(バックアップしたapache2-oldからコピー)
 ssl.conf を適宜修正。
 #ServerName www.exsample.com:443
  を
 #を外し適当な名前をつける
 ServerName dmy.co.jp:443
 SSLのホームディレクトリーは
 DocumentRoot /usr/home/USER/https
 に変更した
 #ServerAdmin you@example.com
 ServerAdmin USER@localhost
 #ErrorLog /usr/local/apache2/logs/error_log
 ErrorLog /usr/local/apache2/logs/ssl_error_log
 #TransferLog /usr/local/apache2/logs/access_log
 TransferLog /usr/local/apache2/logs/ssl_access_log
 その他はそのまま

2 SSL用の鍵の作成   −−−−−−−−  ここ重要  −−−−−

1)鍵を入れるディレクトリを作成
/usr/local/apache2/の下に
# mkdir -m 0700 ssl.key  <−−ディレクトリーの作成
# mkdir -m 0700 ssl.crt  <−−ディレクトリーの作成
# ll
total 38
drwxr-xr-x   2 root  wheel   512 Jun 14  2008 bin
drwxr-xr-x   2 root  wheel   512 Jun 14  2008 build
drwxr-xr-x   2 root  wheel   512 Nov 29 17:27 cgi-bin
drwxr-xr-x   2 root  wheel   512 Jun 14  2008 conf
drwxr-xr-x   3 root  wheel  1024 Jun 14  2008 error
drwxr-xr-x   2 root  wheel  1024 Jun 14  2008 htdocs
drwxr-xr-x   3 root  wheel  3584 Jun 14  2008 icons
drwxr-xr-x   2 root  wheel  2560 Jun 14  2008 include
drwxr-xr-x   2 root  wheel   512 Jun 14  2008 lib
drwxr-xr-x   2 root  wheel   512 Jan 11 16:45 logs
drwxr-xr-x   4 root  wheel   512 Jun 14  2008 man
drwxr-xr-x  14 root  wheel  4608 Jun 14  2008 manual
drwxr-xr-x   2 root  wheel   512 Jun 14  2008 modules
drwx------   2 root  wheel   512 Jan 12 16:12 ssl.crt <−−新にできたディレクトリー
drwx------   2 root  wheel   512 Jan 12 16:12 ssl.key <−−新にできたディレクトリー

2)サーバー秘密鍵の作成
 
#cd ssl.key
#pwd
/usr/local/apache2/ssl.key
VersaPro# openssl genrsa -out server.key 1024 <−− サーバー秘密鍵の作成
Generating RSA private key, 1024 bit long modulus
.........................++++++
......++++++
e is 65537 (0x10001)
# ll
total 2
-rw-r--r--  1 root  wheel  887 Jan 12 16:13 server.key


3)サーバーCSR(証明書署名要請書)の作成
# openssl req -new -key server.key -out server.csr  <−− サーバーcsr(証明書署名要請書)の作成
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]:aaa(県名) Locality Name (eg, city) []:bbb(市町村名) Organization Name (eg, company) [Internet Widgits Pty Ltd]:.(.を入力) Organizational Unit Name (eg, section) []:.(.を入力) Common Name (eg, YOUR name) []:ccc(適当に) Email Address []:.(.を入力) Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:ddd(適当に) An optional company name []:.(.を入力) # ll total 4 -rw-r--r-- 1 root wheel 639 Jan 12 16:18 server.csr -rw-r--r-- 1 root wheel 887 Jan 12 16:13 server.key


4)自己署名の作成(外部機関に証明書の発行を依頼しない)
# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 <−−自己署名 有効期限365日
Signature ok
subject=/C=jp/ST=aaa/L=bbb/CN=ccc
Getting Private key
#ll
total 6
-rw-r--r--  1 root  wheel  753 Jan 12 16:26 server.crt
-rw-r--r--  1 root  wheel  639 Jan 12 16:18 server.csr
-rw-r--r--  1 root  wheel  887 Jan 12 16:13 server.key


5) キーの移動
  サーバーの秘密鍵と証明書(自己署名)をそれぞれ、
/usr/local/apache2/ssl.key/ に server.key
/usr/local/apache2/ssl.crt/ に server.crt
に移動させる。(ssl.confにあるパスとファイル名に一致させること)
移動後の確認
# pwd
/usr/local/apache2/ssl.key
# ll
total 6
-rw-r--r--  1 root  wheel  753 Jan 12 16:26 server.crt
-rw-r--r--  1 root  wheel  639 Jan 12 16:18 server.csr
-rw-r--r--  1 root  wheel  887 Jan 12 16:13 server.key
# cp server.crt ../ssl.crt/  <−− キーの移動
# cd ..
# ls
bin     cgi-bin error   icons   lib     man     modules ssl.key
build   conf    htdocs  include logs    manual  ssl.crt
# cd ssl.crt
# ll
total 2
-rw-r--r--  1 root  wheel  753 Jan 12 16:30 server.crt


netstatでLISTEN状況を確認した。
ポート443をLISTENしている。okだ。

# netstat -atn
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      2  192.168.0.52.23        192.168.0.2.1117       ESTABLISHED
tcp46      0      0  *.443                  *.*                    LISTEN
tcp46      0      0  *.80                   *.*                    LISTEN
tcp4       0      0  *.110                  *.*                    LISTEN
tcp4       0      0  *.23                   *.*                    LISTEN
tcp4       0      0  *.22                   *.*                    LISTEN
tcp4       0      0  *.21                   *.*                    LISTEN
tcp4       0      0  127.0.0.1.25           *.*                    LISTEN
udp4       0      0  127.0.0.1.123          *.*                    
udp6       0      0  fe80:4::1.123          *.*                    
udp6       0      0  ::1.123                *.*                    
udp4       0      0  192.168.0.52.123       *.*                    
udp6       0      0  fe80:1::210:a4ff.123   *.*                    
udp6       0      0  *.123                  *.*                    
udp4       0      0  *.123                  *.*                    
udp4       0      0  *.514                  *.*                    
udp6       0      0  *.514                  *.*                    
Active UNIX domain sockets
Address  Type   Recv-Q Send-Q    Inode     Conn     Refs  Nextref Addr
c24e3000 stream      0      0 c24d1660        0        0        0 /var/run/devd.pipe
c24e2834 dgram       0      0        0 c24e2e38        0 c24e2d20
c24e2c94 dgram       0      0        0 c24e2ec4        0        0
c24e2d20 dgram       0      0        0 c24e2e38        0 c24e2dac
c24e2dac dgram       0      0        0 c24e2e38        0        0
c24e2e38 dgram       0      0 c24e7110        0 c24e2834        0 /var/run/logpriv
c24e2ec4 dgram       0      0 c24e7220        0 c24e2c94        0 /var/run/log
#

3 BASIC認証を導入

1)BASIC認証をする
 インターネットで検索するとBASIC認証するには、BASIC認証するディレクトリー(及びその下のサブディレクトリを含む)に  .htaccess ファイルを置き、ユーザーとパスワードを書いた.htpasswd ファイルをapacheがアクセスできない  場所に置くとあった。
 しかし、apacheのmanualには、ユーザーが多くいて一人一人が自分の特定のディレクトリー以下を  BASIC認証するには上記の方法が良いが、人数が少なく、root権限が使える場合は  httpd.confの中の<Directory></Directory> ブロックに .htaccessの記述をそのまま記述することで行えるとのこと  また、その方が安全であるとの記述。そこで  httpd.confに以下の文を追加した。

# -------------------------------------------------------------
# BASIC認証をHTTPのルートディレクトリー以下にかける
# 2009/01/14 -->
# 各ディレクトリーに .htaccess を置かずに、ここですべて記述
# apache2 の manualにはその方が良いと記述されている。(例外あり)
# BASIC認証が必要なディレクトリーは /usr/home/USER/https 以下
# --------------------------------------------------------------
<Directory "/usr/home/USER/https">    <−−−ここはBASIC認証を必要とするルートディレクトリ
    AuthType Basic            <−−−認証方式をBASICにする
    AuthName "このページは、Webmaster専用です。" <−−− BASIC認証できないときのコメント
    AuthUserFile /etc/.htpasswd      <−−− BASIC認証する人のidとパスワードの保存場所
    require valid-user          <−−−認証が必要
</Directory>
これで/usr/home/USER/https以下のディレクトリーにBASIC認証が必要となる。

2) 利用可能なユーザーとパスワードの登録
/usr/local/apache2/binで
# ./htpasswd -mc /etc/.htpasswd USER <−−ここを入力 -mc:m:MD5で暗号化、c:新しくファイルを作る
                           /etc/.htpasswd 出力するファイル名とそのパス
                           USER 追加するユーザー名
New password:       <−−パスワードを聞いてくる
Re-type new password:     <−−再度パスワードを聞いてくる
Adding password for user USER
# 

2人目以降でユーザーを追加するときは "c"が入らない。つまり
# ./htpasswd -m /etc/.htpasswd ユーザー名

4 参考 APACHE SSLのスタートとストップ

1)APACHE2のスタート  /usr/local/apache2/bin/apachectl startssl
2)APACHE2を停止するには /usr/local/apache2/bin/apachectl stop (変わらず)
(以上 2009/01/16 追記)


(2009/01/18 追記)

5 エラー401を自前のページで表示するための工夫

httpd.confの中に”ErrorDocument 401 /ERROR/error-401.html”と記述していた。 他のエラー403や404も同様に記述している。ところが、401エラーだけは 正しく表示されずに標準出力+以下追加メッセージが表示されることになった。
Additionally, a 401 Authorization Required error was encountered while trying to use an ErrorDocument to handle the request. 
いろいろgoogleしているとここの記述に 認証ができないのだから、認証が必要なディレクトリーの下にあるエラーの記述されているディレクトリーには当然アクセスできないとあった。 なるほどそうだ。話を聞けばそうだと思う。だが、ここまで説明している所は少ない(だろう?)。私も袋小路に入ってしまった一人である。 解決方法はDocumentRootの下のBASIC認証の掛かっていないディレクトリーにエラーメッセージを置けばよいとのこと。
この解説では、HTTPのドキュメントルートの下にHTTPSのページを作り、HTTPSのルートをHTTPのルートと同じにし、 HTTPルートの下にerrorディレクトリを置くというもの。この方法だとhttpsのBASIC認証ページを呼び出すとき サブディレクトリまで指定しないといけない。
http(https) root ---- https(basic 認証ディレクトリー)
                 ---- error directory
そこでいろいろ考え、ALIASを使うことにした。
DocumentRoot "/usr/home/USER/www"   ・・・・・httpのドキュメントルート(httpd.conf)
DocumentRoot "/usr/home/USER/https" ・・・・・httpsのドキュメントルート(ssl.conf)
/usr/home/USER/www/ERROR/      ・・・・・エラーのディレクトリー(httpd.conf)
ErrorDocument 401 /ERROR/error-401.html ・・・エラードキュメント(httpd.conf)
これらを結びつけるためにssl.confに
Alias /ERROR/ "/usr/home/USER/www/ERROR/"
を追加した。これでうまく行くようになった。
(以上2009/01/18 追記)

パソコンのことへ     HomePage     このページのトップ