web-dev-qa-db-ja.com

プロキシサーバー経由のHTTPS接続

プロキシサーバー経由でHTTPS接続を使用することはできますか?はいの場合、どの種類のプロキシサーバーがこれを許可しますか?

Apache HTTPクライアント4でSocks 5プロキシを使用する方法? と重複しています

84
Elz

TLS/SSL(HTTPSのS)は、あなたとあなたが連絡しているサーバーの間に盗聴者がいないこと、つまりプロキシがないことを保証します。通常、 CONNECT を使用して、プロキシ経由でTCP接続を開きます。この場合、プロキシは要求/応答をキャッシュ、読み取り、または変更することができず、したがって役に立たなくなります。

プロキシで情報を読み取れるようにする場合は、次のアプローチを使用できます。

  1. クライアントがHTTPSセッションを開始します
  2. プロキシは透過的に接続をインターセプトし、アドホックに生成された(おそらく脆弱な)証明書Kを返しますa、クライアントによって無条件に信頼されている認証局によって署名されています。
  3. プロキシはターゲットへのHTTPSセッションを開始します
  4. プロキシはSSL証明書の整合性を検証します。証明書が有効でない場合、エラーを表示します。
  5. プロキシはコンテンツをストリーミングし、復号化してKで再暗号化しますa
  6. クライアントはものを表示します

例は、Squidの SSLバンプ です。同様に、burp 設定可能 これを実行します。これも エジプトのISPによってあまり害のないコンテキストで使用されています です。

最新のウェブサイトとブラウザは、このアプローチを無効にする HPKP または ビルトイン証明書ピン を使用できることに注意してください。

52
phihag

簡単な答えは次のとおりです。それは可能であり、特別なHTTPプロキシまたはSOCKSプロキシを使用して実行できます。

何よりもまず、HTTPSはSSL/TLSを使用します。SSL/ TLSは、安全でない通信チャネル上に安全な通信チャネルを確立することにより、エンドツーエンドのセキュリティを設計上保証します。 HTTPプロキシがコンテンツを見ることができる場合、それは中間者の盗聴者であり、これはSSL/TLSの目標を無効にします。したがって、プレーンなHTTPプロキシを介してプロキシする場合は、いくつかのトリックが必要です。

秘Theは、HTTPプロキシを CONNECT という名前の特別なコマンドでTCPプロキシに変換することです。すべてのHTTPプロキシがこの機能をサポートしているわけではありませんが、現在多くのプロキシがサポートしています。 TCPプロキシは、転送されているHTTPコンテンツをクリアテキストで見ることはできませんが、パケットを前後に転送する機能には影響しません。このようにして、クライアントとサーバーはプロキシを使用して相互に通信できます。これは、HTTPSデータをプロキシする安全な方法です。

また、HTTPプロキシが中間者となる安全でない方法もあります。クライアントが開始した接続を受信して​​から、実サーバーへの別の接続を開始します。適切に実装されたSSL/TLSでは、クライアントにプロキシが実サーバーではないことが通知されます。そのため、クライアントは、動作するための警告を無視してプロキシを信頼する必要があります。その後、プロキシは単に1つの接続からデータを復号化し、再暗号化して別の接続にフィードします。

最後に、 SOCKS プロキシを介してHTTPSをプロキシできます。これは、SOCKSプロキシがより低いレベルで機能するためです。 SOCKSプロキシは、TCPとUDPプロキシの両方と考えることができます。

15
Cyker

覚えている限り、プロキシでHTTP CONNECTクエリを使用する必要があります。これにより、要求接続が透過的なTCP/IPトンネルに変換されます。

使用するプロキシサーバーがこのプロトコルをサポートしているかどうかを知る必要があります。

14
chburd

引き続き興味がある場合は、同様の質問に対する回答を次に示します。 TwistedでHTTPプロキシをHTTPSプロキシに変換する

質問の2番目の部分に答えるには:

はいの場合、どの種類のプロキシサーバーがこれを許可しますか?

デフォルトでは、ほとんどのプロキシサーバーはポート443へのHTTPS接続のみを許可するように構成されているため、カスタムポートを持つhttps URIは機能しません。これは通常、プロキシサーバーに応じて構成可能です。たとえば、SquidとTinyProxyがこれをサポートしています。

9
Bruno

SOCKSプロキシを使用してHTTPとHTTPSの両方のリクエストをサポートする私の完全なJavaコードは次のとおりです。

import Java.io.IOException;
import Java.net.InetSocketAddress;
import Java.net.Proxy;
import Java.net.Socket;
import Java.nio.charset.StandardCharsets;

import org.Apache.http.HttpHost;
import org.Apache.http.client.methods.CloseableHttpResponse;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.client.protocol.HttpClientContext;
import org.Apache.http.config.Registry;
import org.Apache.http.config.RegistryBuilder;
import org.Apache.http.conn.socket.ConnectionSocketFactory;
import org.Apache.http.conn.socket.PlainConnectionSocketFactory;
import org.Apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.Apache.http.impl.client.CloseableHttpClient;
import org.Apache.http.impl.client.HttpClients;
import org.Apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.Apache.http.protocol.HttpContext;
import org.Apache.http.ssl.SSLContexts;
import org.Apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;

/**
 * How to send a HTTP or HTTPS request via SOCKS proxy.
 */
public class ClientExecuteSOCKS {

    public static void main(String[] args) throws Exception {
        Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", new MyHTTPConnectionSocketFactory())
            .register("https", new MyHTTPSConnectionSocketFactory(SSLContexts.createSystemDefault
                ()))
            .build();
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);
        try (CloseableHttpClient httpclient = HttpClients.custom()
            .setConnectionManager(cm)
            .build()) {
            InetSocketAddress socksaddr = new InetSocketAddress("mysockshost", 1234);
            HttpClientContext context = HttpClientContext.create();
            context.setAttribute("socks.address", socksaddr);

            HttpHost target = new HttpHost("www.example.com/", 80, "http");
            HttpGet request = new HttpGet("/");

            System.out.println("Executing request " + request + " to " + target + " via SOCKS " +
                "proxy " + socksaddr);
            try (CloseableHttpResponse response = httpclient.execute(target, request, context)) {
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity(), StandardCharsets
                    .UTF_8));
            }
        }
    }

    static class MyHTTPConnectionSocketFactory extends PlainConnectionSocketFactory {
        @Override
        public Socket createSocket(final HttpContext context) throws IOException {
            InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address");
            Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr);
            return new Socket(proxy);
        }
    }

    static class MyHTTPSConnectionSocketFactory extends SSLConnectionSocketFactory {
        public MyHTTPSConnectionSocketFactory(final SSLContext sslContext) {
            super(sslContext);
        }

        @Override
        public Socket createSocket(final HttpContext context) throws IOException {
            InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address");
            Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr);
            return new Socket(proxy);
        }
    }
}
5
soulmachine

sSHを介したHTTPSトンネリング(Linuxバージョン):

1) turn off using 443 on localhost
2) start tunneling as root: ssh -N login@proxy_server -L 443:target_ip:443
3) adding 127.0.0.1 target_domain.com to /etc/hosts

localhostで行うすべて。その後:

target_domain.com is accessible from localhost browser.
2

これは、動的なSSL生成で中間者手法を使用して実現できます。 mitmproxy を見てください-これはPythonベースのSSL対応MITMプロキシです。

2
Zorayr

「プロキシサーバーを介したHTTPS接続がある」とは、プロキシサーバーの中間者攻撃タイプを意味するとは思わない。 TLSを介してhttpプロキシサーバーに接続できるかどうかを尋ねているのだと思います。そして答えはイエスです。


プロキシサーバー経由でHTTPS接続を使用することはできますか?

はい、私の質問と回答をご覧ください。 HTTPSプロキシサーバーはSwitchOmegaでのみ動作します

はいの場合、どの種類のプロキシサーバーがこれを許可しますか?

プロキシサーバーの種類は、通常のWebサイトのようにSSL証明書を展開します。ただし、SSLを介したプロキシ接続を設定するには、ブラウザでpacファイルが必要です。

1
Rick

試した

  • トンネリングを開始:ssh -N -D 12345 login@proxy_server
  • Firefoxの設定でプロキシをlocalhost:12345 として設定します
    • 「すべてのプロトコルにこのプロキシを使用する」にチェックマークを付けます

しかし、これにより、https Webサイトに接続しようとすると「Insecure connection」というエラーが発生しました。

解決策は

  • 「すべてのプロトコルにこのプロキシを使用する」を「選択解除」する
  • プロキシ「localhost:12345」をSOCKSプロキシとしてのみ設定します
  • hTTPプロキシ、SSLプロキシ、FTPプロキシを空白のままにします

Digital Oceanドキュメントからの参照

SOCKSトンネルを使用してVPNなしでWebトラフィックを安全にルーティングする方法

1
shadi