• 締切済み

プログラマブルなHTTPSプロキシサーバーの構築

現在プログラマブルなHTTPS PROXY SERVERが作りたくて悩んでおります。 Proxy Serverでやりたいこと: 1.HTTPの場合はHTMLのコンテキスト(ペイロードデータ)データでフィルタリング 2.SSL/TLS通信はそのまま転送(しかし、SrcとDstは保存しておきたい) 3.SSL/TLS通信でクライアントがアクセスしたいDSTアドレスによって、   適宜、証明書を選択したい。 (多分)技術的に求めていること: 1.HTTP/HTTPS通信に対応したProxy Serverを立てられること 2.HTTPS通信の場合はSRCとDSTアドレスが分かること 3.HTTPS通信は転送ができること、また、場合によっては特定の証明書を適応できること 4.HTTP/HTTPS(証明書適応時)通信のフィルタリング、(広告を消したり、特定のヘッダーを埋め込んだり) 私の調べた範囲ですと ・Ruby(webrickなど)では、HTTPSに対応したProxy Serverは開発できませんでした。 ・Python(tornadeやproxpy)などではHTTP/HTTPSに対応したProxy Serverは構築できましたが、HTTPS通信そのものを転送することができませんでした。特定の証明書を埋め込む必要があり、結果的にMITM攻撃を強制することになってしまいます。 ・SQUIDですと、HTTPS通信をそのまま転送(フォワード)することはできますが、 接続先によって証明書を変更したり、ペイロードデータでフィルタリングをしたりするようなことはできませんでした。 上記のことから、RubyかPythonで、HTTPS通信をフォーワードしつつDSTによって、処理を変更することができればよいのですが・・・、できておりません。 良い実装方法を御存じの方がいらっしゃいましたら 是非、教えて頂けませんでしょうか。 乱文となりましたが宜しくお願い致します。

みんなの回答

  • h271015
  • ベストアンサー率71% (62/87)
回答No.1

> (多分)技術的に求めていること: > 1.HTTP/HTTPS通信に対応したProxy Serverを立てられること > 2.HTTPS通信の場合はSRCとDSTアドレスが分かること > 3.HTTPS通信は転送ができること、また、場合によっては特定の証明書を適応できること > 4.HTTP/HTTPS(証明書適応時)通信のフィルタリング、(広告を消したり、特定のヘッダーを埋め込んだり) Apacheの機能やモジュール(NameVirtualHost/IPVirtualHostやmod_proxy, mod_headers等)で上記のような制御ができそうな気もしましたが、どうでしょうか?

関連するQ&A

  • 透過型プロキシのHTTPS通信

    現在,自作の透過型HTTP/HTTPSプロキシを開発中です. プロキシとしての動作は単にクライアント・サーバ間のデータ受け渡しを行うだけなのですが,現在,透過型の実現で困っております. 透過型の実現には,iptablesを利用し,宛先ポート80番のデータの宛先ポート番号を3128番(本プロキシ)に変換し,本システムにデータを送信しています.HTTPの場合はこれで問題ないのですが,HTTPSの場合が問題です. HTTPSの場合はSSLハンドシェイク等,通常のHTTPとは違う手順を行わなければならないので,HTTP,HTTPSどちらで通信するのかをあらかじめ知る必要があります. クライアントのWebブラウザでプロキシの指定を行う場合(透過型ではない)のHTTPS通信は,クライアントからCONNECTリクエストが実行された場合のみ,HTTPS通信処理へ分岐させればいいのですが,透過型の場合は,クライアントからそのメソッドが実行されず,さらにiptablesによって宛先ポート番号も3128番に書き換えられているため,HTTP通信なのかHTTPS通信なのかを判別することができません. これを実現するためには,どのような方法があるのでしょうか? 透過型プロキシでHTTPS通信をサポートする製品(Webフィルタリングソフト等)はたくさん存在しているため,実現は可能だと考えられるのですが,どのように実現されているのでしょうか? 考えられるひとつの方法としては,HTTP用を3128番,HTTPS用を3129番ポートで実行しておいて,iptablesで80ならば3128,430ならば3129等と振り分ける方法が挙げられますが,どうでしょうか. よろしくお願いいたします.

  • HTTPS(SSL)通信とサーブレットについて

    ショッピングサイトなどで、買い物カゴに入れたあと、支払いするときにHTTPS(SSL)通信になりますが、この場合の仕組みがよくわかりません。 (1)これは、WebサーバをHTTP用とHTTPS(SSL)用の2台構成として、買い物カゴにいれるまでは、HTTP用のWebサーバでアクセスしておいて、支払いするときにHTTPS(SSL)用のWebサーバにアクセスさせることで実現してるのでしょうか? (2)ショッピングサイトを見ると、URLはHTTP://がHTTPS://に変わるだけで、サーバが変わっているようには見えませんが、これは、apacheなどのWebサーバが持つバーチャルホスト機能で実現してるのでしょうか? (3)アプリケーションを開発する側としては、HTTP通信を行うサーブレットはHTTP用のサーバに配置して、HTTPS(SSL)通信を行うサーブレットはHTTPS(SSL)用のサーバに配置しておいて、HTTPS(SSL)通信をしたいときは、HTTP用のサーバに配置したサーブレットから、HTTPS(SSL)用のサーバに配置したサーブレットを呼びだすだけでOKでしょうか? (4)また、(3)が正しい場合、サーブレットの配置さえ気にしていれば、特にHTTPS(SSL)用のプログラムを組む必要はないでしょうか? 調べたのですが、最初からHTTP(SSL)通信する場合の方法しか記載がなくて困っています。

  • ■ Firefoxのプロキシ設定の仕方について ■

    Firefoxブラウザのプロキシ設定について教えてください。 プロキシ設定には、以下 ・HTTPプロキシ ・SSLプロキシ がありますが、それぞれプロキシサーバーのアドレスを設定すると、接続先は以下のようになるのでしょうか? HTTPでのアクセスはHTTPプロキシで設定したサーバーへ HTTPSでのアクセスは、SSLプロキシで設定したサーバーへ またSSLプロキシで設定したサーバーを経由した場合は、そのプロキシサーバーは単なる転送で、プロキシサーバーからはデータの内容は暗号化されたままで分からないのでしょうか? ご解説いただける方、よろしくお願いいたします。

  • JSSEを使用したProxy経由のHTTPS通信について

    いつもお世話になっております。 タイトルの件で質問させてください。 現在JSSEを使用しProxy経由のHTTPS通信するJavaアプリケーションを作成しています。 具体的な動作としては指定のURLのソースをテキストエリアに表示させるだけ なのですが、手こずっています。 インターネット上においてHTTP通信は成功するのですが、HTTPSの場合エラー が発生します。 →ERROR: The requested URL could not be retrieved (上記はエラーの一部です。これはHTML形式でかえってきます。) 試しにイントラネット上にてHTTPS通信をしてみました。 (もちろんProxyは経由しません。) サーバはWeblogicServer6.1Jを使用し、HTTPS通信を試みたのですが下記の ようなExxeptionが発生します。 ちなみにWeblogicは普通にインストールして起動しただけで、特に何もしていません。 javax.net.ssl.SSLException: untrusted server cert chain at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a([DashoPro-V1.2-120198]) (以下略) Weblogicに最初からくっついてくる認証ファイル(?)をどこかに置くとかそういう ことで解決できるのでしょうか? 解決方法をご存じの方はご教授下さい。 --開発環境-- OS:Win2k sp2 IDE:JBuilder5 Personal(JDK1.3.0_2)   Sun JSSE1.0.2を使用 --WeblogicServer-- OS:Win2k sp2 webserver:WeblogicServer6.1J

    • ベストアンサー
    • Java
  • HTTPS(SSL)の仕組みとセキュリティについて

    SSLの仕組みと,そのセキュリティについての質問です. 現在,HTTPSで利用するSSLの仕組みについて勉強をしています. しかしながら, 自身がSSLの仕組みについて正しく理解できているか分かりません. また,どうしても理解ができない点が何個かあり,質問させて頂く次第になりました. (様々な書籍やwebを拝見したのですが,いづれも腑に落ちませんでした...) そのため,まず大まかに私が理解しているHTTP上のSSLの仕組みを書き,最後に質問を書かせて頂こうかと思います. 長くなりますが宜しくお願い致します. ■主な登場人物 ・認証局  CA秘密鍵  CA証明書(公開鍵?)  CA証明書発行要求  ・証明書  KEYファイル(秘密鍵/公開鍵)  CSRファイル/申請書(issuer側の情報/公開鍵)  CRTファイル/サーバー証明書(CSRを認証局の秘密鍵で捻ったモノ) ■証明書の発行 1-1.証明書を発行したい者がCSRファイルという申請書を作成し,認証局に送ります.    →CSRには登録情報(issuer)やサーバー(証明書を発行したい者)の公開鍵などが含まれます. 1-2.認証局はCSRファイルが適切であれば,署名(subject)し,認証局の秘密鍵でCSRの中の公開鍵のみを暗号化します. 1-3.これがCRTファイルになり,証明書を発行したい者に送り返されます. この時,サーバー(証明書を発行した者)は認証局によって署名されたCRTファイルを持っています. 次にこれを利用したHTTPS通信について書きます. ■HTTPS通信 2-1.クライアントがサーバーに通信要請をします. 2-2.サーバーは証明書(CRT)をクライアントに送ります. 2-3.クライアントは送られてきたCRTが信頼できるか認証局の証明書(公開鍵)を使って検証します.    →CRTに埋め込まれているサーバーの公開鍵は認証局の秘密鍵によって暗号化されているので,これを認証局の公開鍵で複合化します.    →認証局の公開鍵はルート証明書といい,事前にブラウザに組み込まれているものとします. 2-4.クライアントは共通鍵を発行します. 2-5.クライアントはCSRから複合化したサーバーの公開鍵を用い,自身で発行した共通鍵を暗号化してサーバーに送ります 2-6.サーバーは受け取った暗号データを自身の持つ秘密鍵で複合化し,共通鍵を取得します. 2-7.後はこの共通鍵でデータを暗号化し通信します, ■質問 1.オレオレ証明書+認証局の場合でも正常に通信ができるのはなぜか 私の理解だと2-3で,クライアントが認証局の公開鍵を用い,サーバーの証明書からサーバーの公開鍵を複合化し,それを元に共通鍵を暗号化しています. これはクライアントが認証局のルート証明書(公開鍵)を保有しているから複合化できるはずです. オレオレ証明書の場合は,認証局の公開鍵がクライアントにインストールされていません. そのため,サーバーの公開鍵を複合化できず,共通鍵の生成に失敗し,通信できなくなると思います. しかしながら,ブラウザは「署名が不明な接続先です」とのエラーを出すだけで,通信(接続)ができてしまいます. なぜでしょうか. 2.IssuerとSubjectは暗号化されていないのか 私の理解だと1-2の認証局では,サーバーの公開鍵しか暗号化されていません. ということはIssuerとSubjectは暗号化されていないということでしょうか. また,それはなぜでしょうか. 3.IssuerとSubjectは偽装できるか opensshを用いることで認証局を構築することができます. この時に,Subjectの設定をベリサインの認証局と全く同じようにし, 証明書も,ベリサインの認証局を使っているサイトのIssuerと全く同じようにした場合, SubjectとIssuerが全く同じ証明書ができると思います. この場合は,本物の証明書と同様の証明書を複製できてしまうのでしょうか. できないとは思いますが,それはなぜでしょうか. 4.証明書の偽装は可能か ブラウザから証明書の情報を見ることができます.もちろんbyteデータのraw certificateも見ることができます. この情報を丸々コピーし,全く異なるサーバーに証明書として読みこませて通信した場合は, 署名されてしまうのでしょうか. されないとは思いますが,それはなぜでしょうか. (例えば,URL=CN情報が異なっているから確認できるとか..?それならCN情報だけ書き換えてしまえばいい?) 5.証明書の検証をするにはどうしたらよいか 証明書を検証をするには,その証明書を発行した認証局の公開鍵を利用するしかないのでしょうか. 例えば,サーバー証明書(CRT)のフィンガープリントsha1データを事前に保持さえしていれば, サーバーに証明書を示された際にCRTのフィンガープリントを比較すれば,特定のサーバーかどうか検証できるか・・? 6.MITMについて MITM攻撃により,証明書が途中で書きかわることが考えられます. この場合は,書き換わった証明書をどのように特定すればいいのでしょうか. 例えば,認証局のルート証明書がないなどが考えられますが, 仮に,Rapid SSLなどで署名されている証明書でMITM攻撃がされた場合どうなるでしょうか? この場合は,Issuerなどを比較するしかないように考えられます. しかし,Issuerはcsr申請の際にうまいこと,書き換えることができてしまいます. そう考えると,どのような対策ができるでしょうか フィンガープリントなどで比較することになるのでしょうか, フィンガープリントは偽装することができないのでしょうか. 以上となります. 様々な質問を書いてしまい,申し訳ありません 説明不足で乱文だとは思いますが, 分かる範囲でお答え頂けませんでしょうか. 宜しくお願い致します.

  • 情報処理安全確保支援 平成31年度 春 午後Ⅰ

    平成31年度 春期試験 午後Ⅰ問題対策② 問2 設問1-(3)について 「メールサービスPはHTTP over TLSでサービスが提供されている。HTTPでアクセスした場合はHTTP over TLSのURLにリダイレクトされる仕様になっており」と記述されていますので、HSTSは実装されていなくても、HTTPでアクセスした場合HTTPSにリダイレクトされるので証明書のエラーは出るかと思います。 なぜ、リダイレクトされないのでしょうか? https://thinkit.co.jp/article/16720

  • テスト環境におけるHTTPSでのアクセス

    このような条件下のウェブサイトがあります。 ○前提条件 ・本番用サーバーは「www.ドメイン名」でSSL証明書を取得 ・問い合わせページは「contact.html」 ・テスト用サーバーは「test.ドメイン名」を用意 ・テスト用サーバーは.htaccessのBASIC認証でアクセスを制限 次に、更新作業を次の手順で進めようと思っています。 1.更新したファイルをテスト用サーバーにアップする 2.ブラウザで「https://www.ドメイン名/contact.html」にアクセスする 3.IDおよびパスワードを入力する 4.内容が更新されていることを確認する 5.更新したファイルを本番用サーバーにアップする さて、ここで悩んでいるのは、2以降の動作です。 3は出ずに、いきなりページが表示されます。 しかも、ページは更新する前の内容のままです。 SSLを取得したのは、「www.ドメイン名」であり、「test.ドメイン名」ではありません。そのため、HTTPSでアクセスしても、そこに表示されるものはSSLで証明されているものではないのだと思います。 このとき、エラーメッセージ等が出て、ページが表示されないのであれば何となく理解できます。 しかし、上述したとおり、更新する前のページが表示されてしまいます。 IDやパスワードも聞いてきません。 ところが、HTTPSではなく、HTTPでアクセスすると、BASIC認証も表示されるし、内容も更新した後のページが表示されます。 理解したいのは次の点です。 1.https://test.ドメイン名/contact.htmlにアクセスしたときに表示されるページは、一体何なのか? 2.また、BASIC認証が出てこないのはなぜか? もし、お分かりの方がおいでならば、ご教示くださいませ。

  • HTTPSにおけるリダイレクト設定に関して

    Apache2.2+mod_sslにてSSL通信環境を構築しました。 DNS設定は「sample.com」も「www.sample.com」も同じサーバIPを指定しております。 「www.sample.com」をコモンネームとした証明書を認証局から取得し、 「https://www.sample.com/」にアクセスする場合は問題はありませんでした。 しかし、「https://sample.com/」にアクセスすると、 IEでは「このWebサイトのセキュリティ証明書には問題があります。」と表示されてしまいます。 この問題を解決しようとリダイレクトの対処も含め、以下の様な対応を行いましたが解決できませんでした。 どの様な対応を行えば、上記問題を解決する事ができるのでしょうか? 「sample.com」についても証明書を発行してもらうしかないのでしょうか? 皆様のお知恵をお借りしたく、何卒よろしくお願い致します。 以下、行った対応 ―――――――――――――――――――――― ■mod_rewrite.soを有効にする。 LoadModule rewrite_module modules/mod_rewrite.so ■httpd.confの末尾に以下を追記する。 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^sample\.com RewriteRule ^/(.*)$ https://www.sample.com/$1 [R=301,L] RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R] </IfModule> ■3.httpd-ssl.confに以下を追記する。 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^sample\.com RewriteRule ^/(.*)$ https://www.sample.com/$1 [R=301,L] </IfModule>

  • 独自SSLに対応したら気をつけることって?

    今契約している独自ドメインに独自SSLを申し込もうと思っています。 独自SSLを使ったことがないので教えてください。 各html内には内部リンクを貼っています。 また、Ajax通信、get、postもしています。 全て相対パスで記述しているのですが、今運用中のサイトを独自SSLでアクセスしたら リンクも全て独自SSLでアクセスされるようになるのでしょうか? 現在運用中のサイト(このサイトでリンクされないようにhttpを大文字で記述しています) http://www.sample.com/ 今後は以下で運用する https://www.sample.com/ https://www.sample.com/にアクセスし、内部リンクで<a href="page1.html">にアクセスしたら https://www.sample.com/page1.htmlにアクセスされる、という認識で良いですか? また、jQueryのAjax通信でurl: "getText.php"みたいにアクセスしています。 そもそもhttps://www.sample.com/から内部リンクをたどっていけばhttpで運用していたときと 変わらず、リンクは相対パスのままで良いのでしょうか? 何か独自SSLだと気をつけないといけなようなことってありますか? サイトでやっているとしたら、Ajaxの他にファイルのアップロードとダウンロードもやっています。 ちなみにPHPでhtmlを生成しています。 どうぞよろしくお願い致します。

    • ベストアンサー
    • HTML
  • 通信のTLSのクライアント証明書について

    通信モジュールが入った組み込み機器の開発を行なっています。 TLS(SSL)で通信を行うのですが、1つの同一のクライアント証明書を例えば1000台の組み込み機器に入れ込んで良いのでしょうか?1台1台別のクライアント証明書を発行するべきでしょうか?お金もかかりますしあまりやりたくないのですが。。