TLS/SSLを使用してHTTPエージェントを暗号化

1689 ワード

HTTPエージェントは明示的であり,実際にアクセスしたURLを他の人に監視することができる.HTTPSプロトコルを使用しても、HTTPエージェントを経由するとCONNECT要求が送信され、エージェントにリモートホストの指定されたポートに連続するように通知されます.すると、アクセス先のドメイン名が明らかになりました.
転送内容を暗号化する方法はありますか?例えばHTTPSのように,TLSプロトコルを用いてプロキシサーバに接続し,HTTP要求を行う.残念なことにziproxyの構成ではこのようなオプションは見つかりませんでした.shlugメールリストで尋ねると、Shell Xuはstunnelというツールに言及した.以前、HTTPのサイトをHTTPSに変えてみましたが、サイトのバックエンドプログラムではユーザーが実際にHTTPSを使っていることを知ることができず、少し憂鬱で、気にしていませんでした.
今回は再びstunnelを呼び出し、プロキシサーバで次のコマンドを実行します.

sudo stunnel -d 0.0.0.0:8081 -r localhost:8080 -p /etc/stunnel/stunnel.pem

これにより、サーバへの8081ポートのすべての要求は、TLS復号後に8080ポートに渡される.同時に応答したデータも暗号化されてリクエスト側に戻ります.
次の問題は、ブラウザがこのエージェントを直接使用できないことです.実際にopensslコマンドで手動で接続する以外に、このエージェントを使用できるプログラムは知りません.では、ローカルで逆暗号化/復号化のサービスをしましょう.やはりstunnelを使います.しかし、Arch Linuxのstunnelは第4版で、コマンドラインパラメータではなく、プロファイルを使用しています.そこでこのUpgrading to stunnel 4を参考に、stunnel 4のプロファイルを書きました.

compression = zlib
foreground = yes
output = /dev/stdout
client = yes
pid = /tmp/stunnel.pid
# or will output to syslog :-(
output = /tmp/stunnel.log

[name]
accept = 8082
connect = server.com:8081

これにより、ローカル8082ポートで傍受し、すべての要求を暗号化してserver.comの8081ポートに転送する.同時に応答したデータは復号されてから返されます.
現在、エージェントサーバから送信されたデータはすべて暗号化されており、覗かれることを恐れていません.
後記:
その後、実はエージェントサーバと私の本体には2つのバージョンのstunnelがインストールされていることに気づきました.名前の中にバージョン番号が付いていないのは3版目で、もう1つは4版目です.
それから、私は突然神器socatを思い出しました--こいつはOpenSSLを支持しています!例えばクライアント側は下のようにすればいいです.

$ socat tcp-listen:8082,fork openssl:server.com:8081,verify=0

socatは本当に神器ですね.cat、netcat、rinetd、stunnelの機能がカバーされています.
このように使用すると、socatは新しいリクエストが来るたびにforkの新しいプロセスで処理されます.資源を少し浪費する.しかし、少し見てみると、stunnelも同じようです.