A universal SSL proxy by DeleGateの和訳

訳者: Hiroshi Suzuki<setter AT i-red DOT info>
翻訳日:2000/04/05
更新 :2005/05/13 , 2005/08/10

コメント:
翻訳の正確さは保証しません。
必ず、原文と共に、使用してください。

訳者メモ:
この文書は、すでに一部機能のサポートが終了している外部フィルタ sslway について説明されているものです。
DeleGate/9.0.1 以降のバージョンでは、FCL="sslway" のような SSL フィルタは、 STLS="fcl" のように指定します。
FCL="sslway" のようなフィルタと比較して、STLS のパフォーマンスや機能は大幅に向上しています。
詳細は、DeleGate による汎用 TLS ゲートウェイと、 リファレンスマニュアルの STLS パラメータ を見てください。

BACK ( DGbeecon )



このドキュメントは "A universal TLS gateway by DeleGate" により、古いものとなりました。 それは、DeleGate/9.0.1 以降で適用でき、以下の利点と共にアップグレードされました:

DeleGateLogo DeleGate による汎用 SSL プロキシ

Yutaka Sato
1998年4月30日 (2002年6月19日 更新)

DeleGateによって中継可能な、 さまざまな、TCP上のアプリケーションプロトコル (HTTP, NNTP, POP, Telnet, Socks, etc.) は、 現在、SSLで、暗号化できます。 DeleGateによる仲介で、非SSLクライアントは、SSLサーバと対話でき、 また、非SSLサーバは、SSLクライアントと対話できます。

DeleGateは、単体でSSL機能を持たないため、SSL暗号化と非暗号化は、 外部フィルタ をDeleGateと関連付けることにより達成されます。 SSLは、双方向プロトコルなので、DeleGateの双方向タイプフィルタ(FCL, FSV, FMD)を使用します。 FCLフィルタは、SSL接続を受けるために、SSLクライアントとDeleGateの間に挿入されます。 FSVフィルタは、SSL接続を確立するために、DeleGateと、SSLサーバの間に挿入されます。 非暗号化または、暗号化される時、アプリケーションプロトコル上の通信は、これらフィルタを通過します。 DeleGateにバインドされた通信は、非暗号化され、DeleGateからの通信は、暗号化されます。

sslway-structure

この、DeleGate用、SSL暗号化/非暗号化フィルタは、SSLwayと呼びます。 SSLwayは、双方向フィルタとして、DeleGateから、呼び出されます。 双方向外部フィルタ機構と、SSLwayフィルタプログラムは、DeleGate/5.3.2から、 Unix同様、Win32と、OS/2にも適用可能になっています。

SSLeayLogo SSLway は、 SSLeay を元にして、作られました。

使用例

ゲートウェイは、以下のように構成されています:
1. まず、以下のファイルをDGROOT/lib/ ディレクトリに配置します。

    sslway
    server-key.pem
    server-cert.pem

2. 以下のパラメータで、DeleGateを起動します:

    delegated \
        -P443 \
        SERVER=https \
        FCL=sslway \
        RELIABLE="*" \
        MOUNT="/* http://localhost/*" \
        REACHABLE=localhost

使用法

SSLwayをDeleGateと共に動作させるには、それを、DeleGateのパラメータ、FSV,FMD,FCLで指定します。 SSLwayの使用法には、基本的に、3つの方法があります:
    FSV=sslway   ... SSL サーバに接続する

    FMD=sslway   ... 上流DeleGateにSSLで接続する

    FCL=sslway   ... SSLクライアントを受け付ける(DeleGateを含む)
 
オプション

    -cert ファイル -- この SSLway が相手に提出する証明書(プライベートキーと対で有効な)
    -key ファイル -- プライベートキーファイル (-cert ファイル に含まれない場合)
    -pass arg -- キーのためのパスフェーズソース (pass:文字列 または file:ファイルパス) [default: keyfile.pas]

    -CAfile file -- CA の証明書を含むファイルの名前
    -CApath dir -- CA の証明書ファイル(それぞれ、`X509 -hash -noout < certificate.pem` のような名前)を含むディレクトリ

    -Vrfy -- 相手の証明書の、提示・認証を強制
    -vrfy -- 相手の証明書が提示された場合、認証を強制
    -Auth -- 相手は証明書を提示する必要があるが、認証しない
    -auth -- 相手の証明書が存在すれば、ログに記録するだけ (廃止された、"-client_auth" と同じ)

    -co  サーバへの接続で SSL を有効にする [FSV のデフォルト]
    -ac  クライアントからの接続で SSL を有効にする [FCL のデフォルト]
    -ad  SSL-ClientHello での自動認識で、SSL または 素通しの何れかを受け付ける
    -ss  FTP で AUTH SSL によりネゴシエイトする(データ接続で暗黙のSSL)
    -st  STARTTLS (プロトコル自動認識) および、SSLトンネリングを受け付ける
    -St  最初に、STARTTLS(プロトコル自動認識)および、FTP での PBSZ+PROT を強制
    -{ss|st|St}/protocol プロトコル {SMTP,POP,IMAP,FTP} に対し STARTTLS を有効にする

必要なファイル(証明書と鍵(PEMフォーマット))は、 LIBPATH (通常、DGROOT/lib/)に配置する必要があります。他の場合、これらファイルの位置は、 環境変数"SSL_CERT_FILE=filename" で、明示するか、 sslwayコマンドの、"-cert filename" オプションで指定する必要があります。 これは、FCLで、sslwayを走らせるか、FSVや、FMDで、対象サーバが、クライアントの証明書 を要求する場合に、sslwayを動作させる場合、必須となります。

任意のサーバにSSL接続するTelenetプロキシのDeleGate:
    delegated -v -P8023 FSV=sslway SERVER=telnet REMITTABLE=telnet

POPサーバから、クライアントへ、中継するHTTPSサーバのDeleGate:

    delegated -v -P8080 FCL=sslway SERVER=https MOUNT="/* pop://popserver/*"

任意のサーバにSSL接続するSocksV4サーバのDeleGate:

    delegated -v -P1080 FSV=sslway SERVER=socks

任意のサーバにSocks経由でSSL接続するTelenetプロキシのDeleGate:

    delegated -v -P8023 FSV=sslway SERVER=telnet CONNECT=socks SOCKS=socks-server

素のTelnetサーバをTelnet/SSLサーバにする:

    delegated -v -P8023 FCL=sslway SERVER=telnet://telnet-server
素のTelnetクライアントをTelnet/SSLクライアントにする:
    delegated -v -P8023 FSV=sslway SERVER=telnet://telnet-delegate
素のPOPサーバをPOP/SSLサーバにする:
    delegated -v -P8110 FSV=sslway SERVER=pop://pop-server
任意のPOPサーバにSSL接続するPOPプロキシのDeleGate:
    delegated -v -P8110 FSV=sslway SERVER=pop
TCP上の任意プロトコルによるクライアント・サーバ間の通信を暗号化する:
    delegated -v -P8000 FSV=sslway SERVER=tcprelay://delegate:8000
    delegated -v -P8000 FCL=sslway SERVER=tcprelay://server-host:port
NNTPクライアント・サーバ間の通信をSSLで暗号化する:
    delegated -v -P8119 FSV=sslway SERVER=nntp://nntp-delegate:8119
    delegated -v -P8119 FCL=sslway SERVER=nntp://nntp-server
DeleGate間の通信をSSLで、暗号化する:
    delegated -v -P8080 FMD=sslway MASTER=delegate-host:8888
    delegated -v -P8888 FCL=sslway
素のHTTPサーバをHTTPS/SSLサーバにする:
    delegated -v -P8080 FCL=sslway SERVER=https MOUNT="/* http://http-server/*"
HTTPS/SSLクライアントのための、NNTP/HTTPゲートウェイサーバ:
    delegated -v -P8080 FCL=sslway SERVER=https MOUNT="/* nntp://nntp-server/*"
素のHTTPクライアントをHTTPS/SSLクライアントにする、httpプロキシのDeleGate:
    delegated -v -P8080 CMAP="sslway:FSV:https:*:*"
指定したサーバにのみSSLwayを利かせる:
    delegated -v -P8023 CMAP="sslway:FSV:telnet:server-list:*" SERVER=telnet
FTPS クライアントを受け付ける(ネゴシエーションなしで、SSL を開始):
    delegated FCL=sslway SERVER=ftp 
FTPS サーバに接続する(ネゴシエーションなしで、SSL を開始):
    delegated FSV=sslway SERVER=ftp 
FTP/SSL クライアントを受け付ける("AUTH TLS" ネゴシエーションによる、オンデマンド SSL):
    delegated CMAP=sslway:FCL:ftp-data CMAP="sslway -st:FCL:ftp" SERVER=ftp 
SSLwrapperのDeleGate:
    delegated -v -P8079 FCL=sslway SERVER=exec XCOM=/usr/etc/in.fingerd

SSLWAYの作り方

1. DeleGateのディレクトリで、"make" する。 (src/delegated と、lib/lib*.a ができます。)
2. filters/Makefile.go 内の初期値 SSLEAY=../../SSL で定義されている SSLEAY 変数を、 SSL ライブラリ(SSLeay または、OpenSSL)ファイル (libssl.a, libcrypto.a, libRSAglue.a) の含まれるディレクトリを指すように編集する。
3. filters/ ディレクトリで、"make -f Makefile.go sslway" する。

sslwayの実行ファイルがディレクトリにできるはずです。

Win32用の、DeleGateと、SSLwayの実行ファイルは、 ftp://www.delegate.org/pub/DeleGate/bin/windows/latest/にあります。 上記例のDeleGate実行ファイル(delegated)は、"DG6_1_18.EXE"のように、 バージョンつきの名前になります。

DeleGateをプラットフォーム(Unixes, OS/2, Win32)にあわせて自分で作るのは、 簡単です。 ftp://www.delegate.org/pub/DeleGate/README.MAKE を見てください。 配布パッケージを、 ftp://www.delegate.org/pub/DeleGate/ で、入手、解凍し、"make"!

自分でSSLWAYを開発する

自前のSSLwayや、他の外部フィルタを開発できます。 (SSHway なんていうの :-). DeleGateの外部フィルタは、一種のシンプルAPIでDeleGateを機能拡張します。 これには、2タイプの外部フィルタがあり; 単方向 フィルタ (FFROMCL, FTOCL, FTOSV, FFROMSV, FTOMD, FFROMMD) と、 双方向 フィルタ (FCL, FSV, FMD)。

SSLwayのような双方向フィルタは、2つのソケットを与え、 ファイルディスクリプタナンバ0と、1に割り当てます。 ディスクリプタ0は、クライアント側のソケットにバインドされ、 1番は、サーバ側にバインドされます。 Win32と、OS/2のようなプラットフォームでは、子プロセスで、ソケットを、継承したり、 標準入出力として扱うことができないため、CFI_init()関数をフィルタプログラムの開始時に コールしなければなりません。 この関数を使うには、library.a と、libsubst.a をDeleGateの lib/ ディレクトリ内にリンクする必要があります。 filters/ ディレクトリ内の Makefile, sslway.c, bdtee.c は、双方向フィルタプログラムの作り方を理解するために役立つでしょう。

同様に、単方向フィルタは、2つのファイルディスクリプタを与え、ナンバ0と、1に割り付け、 それぞれ、入力と出力にバインドします。 プラットフォームでは、子プロセスで、ソケットの継承や、標準入出力として扱うことができないので、 ディスクリプタは、DeleGate(ソケットにリレーする)にバインドするため、 パイプにリダイレクトされます。 したがって、現存のフィルタプログラムは、そのまま、DeleGateに結び付けられます。

これら外部フィルタは、クライアントへの接続に関する情報を、 環境変数、REMOTE_HOST, REMOTE_ADDR, REMOTE_IDENTで、提供でき、 これらは、CGI仕様書で指定されます。

指定した条件で、選択したフィルタを利かせたい場合。 条件付フィルタ利用には、2つの方法があります。 CMAP パラメータ群を上記例のように使用する方法;それぞれのCMAPパラメータは、 サーキットレベルの情報に基づいて、利かせるフィルタを指定します。 他の方法は、CFI スクリプトに記述し、アプリケーションプロトコルの、 (MIME ベース)メッセージヘッダ内の情報に基づき、フィルタを選択します。 CFIは、アプリケーションプロトコル(HTTP, NNTP, SMTP, POP のようにMIMEまたは、RFC822に基づくメッセージフォーマットをもつ) にかかわらず、適用できます。 これは、半分だけできています。 CFI 使用法におけるドキュメント、日本語のみですが... ;-)

[最終更新日: 2001年5月17日]


figure-of-frog Yutaka Sato <ysato@delegate.org> Electrotechnical Laboratory (ETL), AIST, MITI, Japan