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

Freebsd+Apache2+SSL+BASIC認証を使う(2011/09/03)
Last update:2011/09/24  build:2011/09/24




0.前段のおはなし

転居に伴い新しいサーバーにFreebsd8.2とapache2.2.20を導入
2011年7月末に転居したことに伴いwebサーバーを新しくした。 新しくするつもりは無かったのだが、400日くらい連続運転を続けてきたサーバが 一度電源を落とすと、全く立ち上がらなくなった。 何度か一時的に止めたことはあるが、5年ほど24時間運転をしてきた中古ノートパソコンである。 製造から言えば10年を過ぎている。潮時だろう。
Versapro(VersaPro VA70J/WXA: M Pentium 3 700MHz Memoey 256MB HDD 20GB)ご苦労様。

 日立の中古ノートパソコンを購入し、これに新たにOSとwebサーバーソフトを入れることにした。

 ハードウェア:日立 Flora 270W PC8MF1 (CPU:Core2Duo T5500 Memory 1GB HDD 40GB)
      OS:Freebsd−8.2
 webサーバ:apache−2.2.20
 SSL   :OpenSSL 0.9.8q 2 Dec 2010     


1.Freebsd−8.2のインストール

 1)ftpでISOイメージをダウンロードしてCDに焼く
   FreeBSD-8.2-RELEASE-i368-disc1.iso
 2)CDからインストール
   前回インストールした6.1とは少し違うようだ
   標準インストールを選んだからだろうか?(前回はカスタム)
 3)inetdの設定
  インストールの設定でinetdを使う設定を選び、telnetとftp、sshの使用を設定した
 4)ntpdをrc.confに追加した。
  ntpd_enable="YES" ・・rc.confに追加
  windows上で追加し、ftpで転送
  動かない。^Mマークがファイルにあり。
  qkcをインストールして改行コードの変更、日本語コードの変更が必要
  freebsd8.2は標準で/etc/ntp.confがあり、サーバー名が記述されている。
  私は、以前から使っている日本のntpサーバーを記述したntp.confを
  ftpで /etc/ntp.confとして送った。
 5)qkcの導入
  portsからqkcをインストール
  上記4)を行うため。
 6)linuxカーネルの導入
  rc.confに
  linux_enable="YES" を追加
  kldstatコマンドで確認のこと


2.apache−2.2.20をインストール

0)apache-2.2.20をダウンロード
  ファイル名が変わるだけで1)〜7)は前回と同じです。

1) /usr/local/の下にsource/apacheディレクトリーをつくりここにapache2のソースをいれる。
2)圧縮ファイルを展開 /usr/local/source/apache にフォルダーを移す
cd /usr/local/source/apache
 ファイルの展開
  tar zxvf httpd-2.2.20.tar.gz
 httpd-2.0.59 フォルダーができる
3) フォルダ移動 httpd-2.2.20 フォルダーに移動
 cd httpd-2.2.20
4) コンパイルの準備 ここでsslモジュールを入れる
./configure --enable-ssl (約58秒) <−−−−ここが肝心です
5)コンパイル
make  (約2分29秒)
6)インストール
 make install (約6秒)}
 /usr/local/apache2 にインストールされる
7)フォルダ移動
 cd /usr/local/apache2
8)httpd.confファイルの編集
 cd conf (/usr/local/apache2/conf)
 httpd.confは この位置(/usr/local/apache2/conf/httpd.conf)にあり、
 ssl.confは  一段下のextraディレクトリーにある。(/usr/local/apache2/conf/extra/ssl.conf)
 freebsd6.1とはssl.confの位置が異なる。
 httpd.confは大幅に変更され簡単になり、その他の設定は ./extra/以下に別ファイルとして提供されている。
 必要に応じてhttpd.confから読み込む設定である。

httpd.confの変更点は前回とほぼ同じ

エラーメッセージも前回と同じものを使用。併せて、BASIC認証もについてもhttpd.confの最後に前回と同じ内容を追加した。

httpd.confのディフォルトからの変更点
#[Sun Sep 11 20:54:33 2011] [warn] (2)No such file or directory: 
#          Failed to enable the 'httpready' Accept Filter
#[Sun Sep 11 20:54:33 2011] [warn] (2)No such file or directory: 
#                    Failed to enable the 'dataready' Accept Filter
#
# への対応の(ワーニングを発生させない)ために下の2行を追加した
# http://www.skymerica.com/blog/yotsumoto/arch/2007/06/11/000799.html  より
#
#
AcceptFilter http none
AcceptFilter https none

#ServerAdmin you@example.com 
ServerAdmin USER@localhost

#ServerName www.example.com:80
ServerName USER.ddo.jp:80

#DocumentRoot "/usr/local/apache2/htdocs"
DocumentRoot "/usr/home/USER/www"

#
# This should be changed to whatever you set DocumentRoot to.
#
#<Directory "/usr/local/apache2/htdocs"> ドキュメントルートの変更
<Directory "/usr/home/USER/www">  ドキュメントルートの変更

    # Options Indexes FollowSymLinks  <---- この行はIndexes があると
            indel.htmlファイルが無い場合ディレクトリー表示する
    Options -Indexes FollowSymLinks

#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:                          エラーメッセージを自分用に変更
ErrorDocument 400 /ERROR/error-400.html
ErrorDocument 401 /ERROR/error-401.html
#ErrorDocument 402 http://www.example.com/subscription_info.html
ErrorDocument 403 /ERROR/error-403.html
#ErrorDocument 404 /missing.html
ErrorDocument 404 /ERROR/error-404.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
ErrorDocument 405 /ERROR/error-405.html
#ErrorDocument 500 "The server made a boo boo."
ErrorDocument 500 /ERROR/error-500.html


# Secure (SSL/TLS) connections    sslを利用するのでincludeする
#Include conf/extra/httpd-ssl.conf
Include  conf/extra/httpd-ssl.conf


# BASIC認証をするために、httpd.confに以下を追加
# -------------------------------------------------------------
# BASIC認証をHTTPのルートディレクトリー以下にかける
# 2009/01/14 -->
# 各ディレクトリーに .htaccess を置かずに、ここ(httpd.conf)ですべて記述
# apache2 の manualにはその方が良いと記述されている。(例外あり)
# BASIC認証が必要なディレクトリーは /usr/home/USER/https 以下
# --------------------------------------------------------------
<Directory "/usr/home/USER/https">
    AuthType Basic
    AuthName "Sorry ! This page is Webmaster only"
    AuthUserFile /etc/.htpasswd
    require valid-user
</Directory>



 9)ssl.confファイルの編集
   
   変更した点をここに列記
   ssl.confを設定したつもりだが、hpptsによるアクセスができなかった。
   /usr/local/apache2/logs/ssl_error_logを調べてみると

   
   [Sun Sep 11 21:08:02 2011] [error] [client 192.168.24.51] 
      client denied by server configuration: /usr/home/USER/https/
   
   ssl.confの設定が何かまずいようだ。

   httpd.confの設定は2.0.*と違って2.2.*から大きく変更されている。   
   httpd.confを見ると、まず、ルートのアクセスを全て拒否し
   
       # First, we configure the "default" to be a very restrictive set of 
       # features.  
       #
       <Directory />
            Options FollowSymLinks
            AllowOverride None
            Order deny,allow
            Deny from all
       </Directory>
   

   その後、すこしずつアクセス可能な範囲を拡げる記述している。

   defaultのhttpd.conf ssl.confを使うと当然httpsによるアクセスは可能となった。
   (もちろんそれなりの設定は必要)
   ssl.confでデフォルトと変えているのはドキュメントルートである。
    http のドキュメントルートは  /usr/HOME/USER/www
    httpsのドキュメントルートは  /usr/HOME/USER/https
    である。httpとhttpsのドキュメントルートが異なることで
    httpd.confに記述されたディレクトリによるアクセス許可がssl.confには適用されないことが理解できた。
    
    そこで、ssl.confにもアクセス許可のディレクトリを記述した。


httpd−ssl.confのディフォルトからの変更点
#   General setup for the virtual host
#DocumentRoot "/usr/local/apache2/htdocs"
DocumentRoot "/usr/home/USER/https"

# First, we configure the "default" to be a very restrictive set of 
# features.  
#   2011/9/13 httpd.confからコピー
<Directory />  ・・ すべてのルートアクセスを禁止
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

#<Directory "/usr/local/apache2/htdocs">  2011/9/13 httpd.confからコピーして修正(www --> https)
#  この<Directory>でアクセスを許可
<Directory "/usr/home/USER/https">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    # Options Indexes FollowSymLinks  <---- この行はIndexes があるとディレクトリー表示する
    Options -Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all

</Directory>


#ServerName www.example.com:443
ServerName USER825.ddo.jp:443

#ServerAdmin you@example.com
ServerAdmin USER@localhost

#ErrorLog "/usr/local/apache2/logs/error_log" sslのエラーログをアパッチエラーログから変更
ErrorLog "/usr/local/apache2/logs/ssl_error_log"

#TransferLog "/usr/local/apache2/logs/access_log" sslアクセスログをアパッチアクセスログから変更
TransferLog "/usr/local/apache2/logs/ssl_access_log"

# 2009/1/18 error 401 対応のため設置
# httpsのERROR ディレクトリーをhttpのERRORディレクトリーにリンクさせる
# でないと、オリジナルのerror-401.htmlが表示されない。
#  
Alias /ERROR/ "/usr/home/USER/www/ERROR/"

これでhttpsによるアクセスが可能になった。(もちろん下に記述した鍵の設定が前提)



3. SSL用の鍵の作成   −−−−−−−−  ここ重要  −−−−−

1)鍵を入れる場所がapache2.2から変更になった。
 apache2.0 /usr/local/apache2/ssl.crt/ssl.crt と /usr/local/apache2/ssl.key/ssl.key
 apache2.2 /usr/local/apache2/conf/ssl.crt   と /usr/local/apache2/conf/ssl.key
 に変更になった。


2)サーバー秘密鍵の作成 ( 以下2)〜4)は前回と同じ )
 
#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/conf/ に server.key
/usr/local/apache2/conf/ に server.crt
に移動させる。(ssl.confにあるパスとファイル名に一致させること)
移動後の確認
Flora-T5500# pwd
/usr/local/apache2/conf
Flora-T5500# l
drwxr-xr-x  2 root  wheel    512 Sep 13 20:58 extra    ・・ この下にhttpd-ssl.confがある
-rw-r--r--  1 root  wheel  13346 Sep  4 14:14 httpd-org.conf
-rw-r--r--  1 root  wheel  14981 Sep 13 23:10 httpd.conf
-rw-r--r--  1 root  wheel  12958 Sep  4 14:14 magic
-rw-r--r--  1 root  wheel  49815 Sep  4 14:14 mime.types
drwxr-xr-x  3 root  wheel    512 Sep  4 14:14 original   ・・ オリジナルのconfファイルが入っている
-r--------  1 root  wheel    725 Sep 12 22:03 server.crt
-r--------  1 root  wheel    586 Sep 12 22:02 server.csr  ・・ これはcrtを作った後は使わないようだ?
-r--------  1 root  wheel    887 Sep 12 21:53 server.key


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

Flora-T5500# netstat -atn
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address       (state)
tcp4       0      0 192.168.24.111.23      192.168.24.51.1438     ESTABLISHED
tcp4       0      0 *.110                  *.*                    LISTEN
tcp4       0      0 *.23                   *.*                    LISTEN
tcp4       0      0 *.22                   *.*                    LISTEN
tcp4       0      0 *.21                   *.*                    LISTEN
tcp4       0      0 *.*                    *.*                    CLOSED
tcp46      0      0 *.443                  *.*                    LISTEN
tcp4       0      0 *.*                    *.*                    CLOSED
tcp46      0      0 *.80                   *.*                    LISTEN
tcp4       0      0 127.0.0.1.25           *.*                    LISTEN
udp4       0      0 127.0.0.1.123          *.*                    
udp6       0      0 ::1.123                *.*                    
udp6       0      0 fe80:3::1.123          *.*                    
udp4       0      0 192.168.24.111.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
c49e4ec8 stream      0      0 c4afe96c        0        0        0 /var/run/devd.pipe
c49e4b6c dgram       0      0        0 c49e5b6c        0 c49e5ac0
c49e5a14 dgram       0      0        0 c49e5c18        0        0
c49e5ac0 dgram       0      0        0 c49e5b6c        0 c49e4e1c
c49e4e1c dgram       0      0        0 c49e5b6c        0        0
c49e5b6c dgram       0      0 c49d2a78        0 c49e4b6c        0 /var/run/logpriv
c49e5c18 dgram       0      0 c49d2b84        0 c49e5a14        0 /var/run/log
Flora-T5500# 

4. BASIC認証を導入(前回と同じ)httpd.confに記述済

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 ユーザー名

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

1)APACHE2のスタート  Apache2.0から変更になった。startsslは使わずstartのみ
 最初startsslを使うとエラーが出て、とまどった。
 /usr/local/apache2/bin/apachectl startssl (Apache2.0.59)
 /usr/local/apache2/bin/apachectl start (Apache2.2.20)
2)APACHE2を停止するには /usr/local/apache2/bin/apachectl stop (変わらず)


(2009/01/18 追記)

6. エラー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     このページのトップ