2013-04-26 17 views
5

私はDelphi XE3でIndyとOpenSSLを使って、同じポート上でHTTPとHTTPSの両方の接続でトラフィックを処理できるWebサーバーを設定しようとしています。Delphi XE3でTIdTCPServerとOpenSSLを使用して、同じポート上でSSLトラフィックと非SSLトラフィックをサポートするにはどうすればよいですか?

私はこれに2つの主なアプローチを見てきましたが、どちらも私にとってはうまくいかないようです。

最初に:Up-front TLS/SSL。これは、ストリームの最初の数バイトを読み込んで、非セキュアハンドシェイクの "Client-Hello"部分を探し、サーバーSSLハンドシェイク応答を呼び出す(見つかった)場合、OpenSSLライブラリは認識しません私はメッセージの先頭のバイトを取り除いたので、ハンドシェイクします。

2番目:STARTTLS(または同等のもの)の後のTLS。これには特別な文字セット(STARTTLS)が送信され、すぐに「Client-Hello」が続きます。サーバーはSSLハンドシェイクメッセージ全体をそのままOpenSSLライブラリに渡します。このアプローチの問題は、ほとんどのWebブラウザではサポートされていないことです(RFC 2817)。 2つのアプローチの概要について

、ここを見て: What happens on the wire when a TLS/LDAP or TLS/HTTP connection is set up?

どのように私は、Delphi XE3にTIdHTTPServerとOpenSSLを使用して、同じポートでSSLと非SSLトラフィックをサポートすることができますか?

答えて

1

インディボックスではお求めのものは受け入れられません。デフォルトのSSL実装は、独自のソケットI/Oをすべて実行するOpenSSLの従来のAPIを使用しているため、データを最初に確認することなく、完全なハンドシェイクデータに直接アクセスする必要があります。しかし、すべてが失われることはありません。

1)libpcap/Winpcapを使用して、ソケットがアプリケーションに提供される前に、新しい接続用のワイヤから取り出される生データの最初の数バイトをキャプチャして調べます。

2)OpenSSLの新しいBIO APIまたはMicrosoftのSChannel APIを使用する独自のTIdIOHandler派生クラスを作成して、ソケットI/Oを制御し、着信バイトを自分で読み取ってから、処理のための暗号化エンジン。

+0

代替提案ありがとうございます!私はそれらを調べて、どちらかを実装すると、私はここに再び投稿します。 – Andy

2

これは、Internet Direct(Indy)で実装するのが簡単ではないと思うでしょう - Apache HTTPサーバーはそれを実行できません。これは、a)ほとんど誰もこの機能を望んでいないことb)実装するか、またはc)セキュリティリスクを導入する可能性があります。

https://serverfault.com/questions/359461/apache-answer-both-http-and-https-on-the-same-port

で受け入れ答えから、これは、Apacheで可能であることを行っていません。 Apacheでは、 ではHTTPSとHTTPを同じポートで実行できません。

HTTPS/OpenVPN またはSSHを同じポートで実行するように設計されたポートマルチプレクサをいくつか認識していますが、これらには追加のソフトウェアが必要です。私は HTTPSとHTTPを多重化するツールを認識していません。