DeleGateを使って AN HTTPDで SSL通信する

作成日:2003.2.28

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化する方法も参考に。

  1. 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は環境変数で変更が可能である。

  2. 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)にも同じもの(デフォルト)がある。

  3. 証明書と鍵(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
    

  4. 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などのポート番号は外からは陽には現れない。


  5. 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 の問い合わせはない。
    
    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-ssl.cfgを変更したときには、再度delegate-ssl.batを実行する。
    DeleGateを終了するときは delegate-ssl.bat を実行し、「Create a new service ?」で n をキー入力する。
    
    The service `DeleGate Server -P443' exists.  Delete it ? [y] / n : y 
    Create a new service ? [y] / n : n
    
    Win9x系ではサービスではなく MS-DOSプロンプトで実行されるので、Ctrl+C で終了する。

  6. ブラウザから 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 ┠─→┨鍵,証明書 ┃
      ┗━━━━┛    ┗━━━━━┛
    
  7. 関連情報へのリンク
     SSL用証明書の作成(Windows編)(パソコンおやじさん)
     OpenSSL Memo



作成:いと,mailto:gfh05223@nifty.com