AN HTTPDで SSL(暗号化)通信したいという話がときどき話題になる。
http://homepage1.nifty.com/yito/namazu/gbook/20030225.0114.html
http://homepage1.nifty.com/yito/namazu/gbook/20021027.1830.html
http://homepage1.nifty.com/yito/namazu/gbook/20020825.1813.html
http://homepage1.nifty.com/yito/namazu/gbook/20011112.2309.html
現在中田さんが検討中のようなのでそのうちに AN HTTPDにも実装されるであろうが、今すぐにという人には何らかの実現手段が必要である。上記のページで紹介されているが、OpenSSLと Stone あるいは Orenosp などを使った実例がある。
AN HTTPD + Stone 〜SSL未対応WEBサーバでSSL通信〜
Orenosp Secure Reverse Proxy
Stoneや Orenosp というのはプロクシ機能を持つプログラムであり、ポート 443へのアクセスをポート 80にフォワードして SSLを実現している?ようなので、それなら DeleGate でも可能ではないかと思い調べてみると確かにできるようである。
http://i-red.info/docs/DeleSSL/ssl.html
実際に上記のページに沿って試してみたところ動作確認できた。以下メモ代わりに設定方法をまとめる。ただ、見様見真似なので自信を持ってお勧めというわけではない。おかしなところがあればご指摘ください。
DeleGate については DeleGateを使ってLAN内部のサーバを公開する方法 で紹介しているのでここでは触れない。
[追記] DeleGateを使い HTTP,FTP,SMTP,POP3,IMAPを SSL化する方法も参考に。
- DeleGate関係のファイルのダウンロード、解凍
下記 URLからDeleGateの最新版プログラムと sslway をダウンロードする。
http://www.delegate.org/anonftp/DeleGate/bin/windows/
2003/2下旬 現在、8.4.0 が最新版であるが、まだ FIX していないのかこのバージョンでは SSLは動作しなかった(Win98ではもう少し前のバージョンまで逆上ったが動作しなかった。かなり以前にダウンロードした 8.0.6では動いたが。筆者自身が確認したわけではないがメールで質問された方が Win98SEで 8.0.6がどうやっても動かなかったとのことであった)。Win2000で 8.3.4では動作したので 8.3.4 のディレクトリ下の dg8_3_4.zip をダウンロードする(以下で 8_x_x の個所は 8_3_4 と読み替えること)。
2003/3下旬 現在、Win2000/XPで 8.5.2 が問題なく動作している。Win98は相変わらずだめのようである。
さらに、sslway ディレクトリ下の sslway.exe もダウンロードする。
ダウンロードした dg8_x_x.zip を例えば C:\Program Files\delegate に解凍する。
sslway.exe を C:\Program Files\delegate\lib にコピーする。
(注) DGROOT がデフォルトで /Program Files/DeleGate となっているので勝手な場所に置いてはいけない(ドライブは C 以外でも可)。DGROOTは環境変数で変更が可能である。
- OpenSSL関係のファイルのダウンロード、解凍
OpenSSL for Win32 on Mingw32/Cygwinから OpenSSL 完全版バイナリ(zipファイル、2003/2末現在 OpenSSL-DLL-2002-09-13.zip)をダウンロードし、C:\usr\local\ssl(ドライブは C でなくてもよいが \usr\local\ssl は決め打ちなのでこの通りであること)に解凍する。
C:\usr\local\ssl\openssl.cnf(opensslというショートカットに見えるかもしれない)をテキストエディタで編集する。メモ帳だと改行で改行されないので TeraPad などのテキストエディタを使うのがよい。
88行目を 1024 -> 512 に変更し、保存する。
default_bits = 512(追記) 上記サイトからダウンロードできるOpenSSLはバージョンが古い(0.9.6g)ので脆弱性の問題がある。新しいバージョン(0.9.7b)は下記のURLからダウンロードできるので、こちらの方がよいだろう(openssl-0.9.7b-1-mswin32.zip)。
http://jarp.jin.gr.jp/win32/
また、openssl.cnfは PHPをインストールしたフォルダの下(C:\php\openssl)にも同じもの(デフォルト)がある。
(さらに追記) さらに新しいバージョンは以下の URLなどからどうぞ。
http://www.slproweb.com/products/Win32OpenSSL.html
http://www.aconus.com/~oyaji/ftp/download.htm
また、openssl.cnfは PHPをインストールしたフォルダの下(C:\php\openssl)にも同じもの(デフォルト)がある。
- 証明書と鍵(PEMフォーマット)の作成
下図のようにカレントディレクトリを変更後、openssl コマンドを実行する。
openssl req -new -nodes -x509 -keyout server-key.pem -out server-cert.pem問いに答えていくと bin 以下にserver-key.pem と server-cert.pem の2つのファイルが作成される。質問事項への入力は極端な話全て空でもファイルは作成される。この2つのファイルを C:\Program Files\DeleGate\lib の下にコピーする。
C:\usr\local\ssl\bin>openssl req -new -nodes -x509 -keyout server-key.pem -out server-cert.pem Using configuration from /usr/local/ssl/openssl.cnf Loading 'screen' into random state - done Generating a 512 bit RSA private key ..................++++++++++++ .......++++++++++++ writing new private key to 'server-key.pem' ----- 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]:Kanagawa Locality Name (eg, city) []:Kawasaki Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:My Section Common Name (eg, YOUR name) []:My Name Email Address []:user@domain.jp
- DeleGate実行用ファイルの作成
C:\Program Files\delegate に delegate-ssl.batファイルを作成する(内容は以下の1行のみ)
dg8_x_x.exe +=delegate-ssl.cfg(注) 上で dg8_x_x.exe -> dg8_3_4.exe と読み替えること。
次に C:\Program Files\delegate に delegate-ssl.cfgファイルを作成する(以下は設定例)
(注)「#」以下行末まではコメントである-- (この下の行から) --------------------------------------------------- -P443 SERVER=https FCL=sslway MOUNT="/* http://localhost/*" #サーバへの全アクセスを SSL通信する #MOUNT="/hoge/* http://localhost/hoge/*" # /hoge の下へのアクセスだけを SSL通信する場合はこちらのように #MOUNT="/* http://192.168.0.3/*" #アクセスを別のPC(例えば 192.168.0.3)に向ける場合はこのように REACHABLE=localhost #MOUNTしたホストに応じて変更する RELIABLE="*" ADMIN=user@host.domain.jp -- (この上の行まで) ---------------------------------------------------具体的な設定例
通常は AN HTTPDとDeleGateを同一のホストで動作させ、https://〜/ のアクセスを DeleGateが受けてそれを localhost で実行中の AN HTTPDにポートフォワードするという動作になると思われる。その場合には cfg ファイルは以下のようになる(ここでは全てのパスへのアクセスが https であるとしている。特定のパスのみを httpsアクセスしたいときは上のコメント行を参考に)。このままコピーして使えるはずである。-- (この下の行から) --------------------------------------------------- -P443 SERVER=https FCL=sslway MOUNT="/* http://localhost/*" #サーバへの全アクセスを SSL通信する REACHABLE=localhost RELIABLE="*" ADMIN=user@host.domain.jp -- (この上の行まで) ---------------------------------------------------一方下図は、DeleGateが動くPC1とAN HTTPDが動くPC2が別のケースである。
ルータでポート80は DeleGate が動く PC1にフォワードする。
Internet │ ┏━┻━┓ ┃Router┃ ┃ ┃ https://host.domain.jp/┗┳━┳┛ ┌───┘ └───┐ │192.168.0.2 │ 192.168.0.3 ┏━━┻━━┓ ┏━━┻━━┓ ┃ PC1 ┃ ┃ PC2 ┃ ┃ DeleGate ┃ ┃ AnHttpd ┃ ┗━━━━━┛ ┗━━━━━┛ │ ↑ │ http://192.168.0.3/ │ │ └─────────┘
delegate-ssl.cfgファイル -- (この下の行から) ------------------------------- -P443 SERVER=https FCL=sslway MOUNT="/* http://192.168.0.3/*" #アクセスを別のPC(例えば 192.168.0.3)に向ける場合はこのように REACHABLE=192.168.0.3 #他のサーバへのプロクシとして使用されないために必ず設定する RELIABLE="*" ADMIN=user@host.domain.jp -- (この上の行まで) -------------------------------以下は、PC 一台だけでバーチャルホストを構成し、http でも https でもアクセス可能にするケースである。
AN HTTPD のバーチャルホストは以下のように設定する。
host1.domain.jp 192.168.0.2 8001 c:\www\doc1 host2.domain.jp 192.168.0.2 8002 c:\www\doc2 host3.domain.jp 192.168.0.2 8003 c:\www\doc3ただしプライベートIPアドレスが 192.168.0.2、ホスト名が host1〜3.domain.jp、ポート番号は 80は DeleGateが使うので 8001〜8003、ドキュメントルートは c:\www\doc1〜3 とした。
DeleGateはポート 80と 443 の二つを動かす必要があり、設定は以下の通りである。-- (この下の行から) ------------------------------- -P80 SERVER=http MOUNT="/* http://192.168.0.2:8001/* vhost=-host1.domain.jp" MOUNT="/* http://192.168.0.2:8002/* vhost=-host2.domain.jp" MOUNT="/* http://192.168.0.2:8003/* vhost=-host3.domain.jp" REACHABLE=192.168.0.2 RELIABLE="*" ADMIN=user@host.domain.jp -- (この上の行まで) ------------------------------- -- (この下の行から) ------------------------------- -P443 SERVER=https FCL=sslway MOUNT="/* http://192.168.0.2:8001/* vhost=-host1.domain.jp" MOUNT="/* http://192.168.0.2:8002/* vhost=-host2.domain.jp" MOUNT="/* http://192.168.0.2:8003/* vhost=-host3.domain.jp" REACHABLE=192.168.0.2 RELIABLE="*" ADMIN=user@host.domain.jp -- (この上の行まで) -------------------------------アクセスする URLは http://host1.domain.jp/ あるいは https://host1.domain.jp/ などであり、8001などのポート番号は外からは陽には現れない。
- DeleGateの実行
カレントディレクトリを C:\Program Files\delegate に移し、コマンドプロンプトから delegate-ssl.bat を実行する。
NT系のOS(WinNT/2000/XP)では DeleGate Server -P443 がサービスとして実行される。
バッチファイル(delegate-ssl.bat)を実行するといくつかの y/n の問い合わせがあるが、通常はデフォルトのまま(単にEnterキー)でよい。Win9X系ではサービスにはならないので途中で y/n の問い合わせはない。
delegate-ssl.cfgを変更したときには、再度delegate-ssl.batを実行する。
C:\Program Files\DeleGate>delegate-ssl.bat C:\Program Files\DeleGate>dg8_3_4.exe +=delegate-ssl.cfg DeleGate/8.3.4 (January 21, 2003) AIST Product ID: 2000-ETL-198715-01, H14PRO-049 Copyright (c) 1994-2000 Yutaka Sato and ETL,AIST,MITI Copyright (c) 2001-2003 National Institute of Advanced Industrial Science and Technology (AIST) -- FTP: <URL:ftp://ftp.delegate.org/pub/DeleGate/> WWW: <URL:http://www.delegate.org/> Mail:<URL:mailto:feedback@delegate.org> <URL:http://www.delegate.org/feedback/> DGROOT=C:/Program Files/DeleGate ADMIN=user@host.domain.jp Trying to start as a service [DeleGate Server -P443] ... The service `DeleGate Server -P443' exists. Delete it ? [y] / n : OK. STOPped the previous service. OK. DELETEd the previous service. Create a new service ? [y] / n : Set Automatic Start on System Startup ? [y] / n : OK. The service is created successfully. OK. Parameters are saved in registry: "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DeleGate-P443\Parameters" OK. Environments are saved in registry: "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DeleGate-P443\Environments" OK. The service started successfully.
DeleGateを終了するときは delegate-ssl.bat を実行し、「Create a new service ?」で n をキー入力する。
Win9x系ではサービスではなく MS-DOSプロンプトで実行されるので、Ctrl+C で終了する。
The service `DeleGate Server -P443' exists. Delete it ? [y] / n : y Create a new service ? [y] / n : n
- ブラウザから httpsアクセス
DeleGateが動くホストに https://ホスト名/ とブラウザからアクセスすると以下のようなメッセージが表示される(IEの場合)。「はい」とするとそのページが表示さるる。
以上のSSLの仕組みを図示すると、概略下図の通りである。
Delegateは AN HTTPDに代わって、クライアント認証および通信の暗号化・復号を行う。
Delegateは HTTPプロトコル以外に、POP, Telnet, Socks, Ftp などの暗号化も可能である。
IE等 https ┏━━━━━┓ http ┏━━━━━┓ SSLクライアント ──←→┨Delegate ┠←──→┨AN HTTPD ┃ 443┃(SSLプロキシ)┃ 80┃(非SSLサーバ┃ ┗━━┯━━┛ ┗━━━━━┛ ↑ ┏━━━━┓作成┏━━┷━━┓ ┃OpenSSL ┠─→┨鍵,証明書 ┃ ┗━━━━┛ ┗━━━━━┛- 関連情報へのリンク
SSL用証明書の作成(Windows編)(パソコンおやじさん)
OpenSSL Memo