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# pwdSSLで走ってはいるような?? ポート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をダウンロード 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 その他はそのまま 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(証明書署名要請書)の作成 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 # 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 ユーザー名 1)APACHE2のスタート /usr/local/apache2/bin/apachectl startssl 2)APACHE2を停止するには /usr/local/apache2/bin/apachectl stop (変わらず) (以上 2009/01/16 追記) (2009/01/18 追記) 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 追記) |