Proxy sunucuları üzerinden HTTPS bağlantıları


Yanıtlar:


67

TLS / SSL (HTTPS'deki S), sizinle iletişim kurduğunuz sunucu arasında gizli dinleyici olmadığını, yani proxy bulunmadığını garanti eder. Normalde, CONNECTproxy aracılığıyla bir TCP bağlantısı açmak için kullanırsınız . Bu durumda, proxy herhangi bir isteği / yanıtı önbelleğe alamaz, okuyamaz veya değiştiremez ve bu nedenle oldukça kullanışsız olacaktır.

Proxy'nin bilgileri okuyabilmesini istiyorsanız, aşağıdaki yaklaşımı uygulayabilirsiniz:

  1. İstemci HTTPS oturumunu başlatır
  2. Vekil şeffaf bağlantısı ve döner bir ad-hoc oluşturulan (muhtemelen zayıf) sertifikası K yakaladığını bir koşulsuz müşteri tarafından güvenilen bir sertifika yetkilisi tarafından imzalanmış.
  3. Proxy, hedeflemek için HTTPS oturumunu başlatır
  4. Proxy, SSL sertifikasının bütünlüğünü doğrular; sertifika geçerli değilse hata görüntüler.
  5. Vekil, içerik akışları deşifre ve K yöntemiyle tekrar şifreler a
  6. İstemci bir şeyler görüntüler

Bir örnek, Squid'in SSL çarpmasıdır . Benzer şekilde, burp bunu yapacak şekilde yapılandırılabilir . Bu, Mısırlı bir ISS tarafından daha az zararsız bir bağlamda da kullanılmıştır .

Modern web sitelerinin ve tarayıcıların bu yaklaşımı ortadan kaldıran HPKP veya yerleşik sertifika pinleri kullanabileceğini unutmayın .


13
Bu prensipte işe yarayabilir, ancak tarayıcıların HTTPS istekleri için HTTP proxy'leriyle konuşma yolu bu değildir. Burada açıklanma şekli, proxy sunucusunun etkili bir şekilde Ortadaki Adam olduğunu ima eder (bu nedenle buna göre güvenilmesi gerekir).
Bruno

5
Squid bunu yapıyor. Buna SSL Bump denir .
Adam Mackler

3
Son kullanıcıya çok fazla uyarı olmadan çalışmaz. "Müşterinin kayıtsız şartsız güvenmesi" - böyle bir şey yoktur. Sertifika mükemmel-AAA +++ olsa bile, son kullanıcının istediği şeyle eşleşmeyen farklı etki alanını göstermeye devam eder, bu da herhangi bir aklı başında tarayıcının (burada IE anlamına gelmez ...) yukarı ve aşağı çığlık atmasına neden olur. Elbette, SSL kontrollerini devre dışı bırakan parametrelerle wget kullanmak mümkündür, ama bilin bakalım ne olacak? bu bağlantı, temel güvenlik kontrolleri devre dışı bırakıldıktan sonra artık "SSL" olarak adlandırılamaz.
Van Jone

1
@Van Jone Unconditionally trustedbir CA sertifikasını ifade eder. CA sertifikalarının alan adı yoktur. Yanıtı, kullanıcıya herhangi bir uyarı vermeden pratikte işe yaradığı / işe yaradığı iki örnekle değiştirdim.
phihag

6
Cevabım sizin "sahte CA" dediğiniz şeye dayanır. CA'nın sertifikası , ya kullanıcı (veya bilgisayarındaki yazılım, örneğin kurumsal yapılandırma veya kötü amaçlı yazılım) onu bu şekilde yapılandırdığı için ya da CA, gibi büyük tarayıcıların güvendiği CA'lardan birinden alınmış olduğu için koşulsuz olarak güvenilmektedir. MCS durumunda. Proxy, istemcinin talep ettiği her etki alanı için yeni bir geçerli sertifika oluşturur, bu nedenle yanıtın sonunda belirtilen anti-MITM olanakları olmadan istemci fark etmez.
phihag

24

Kısa cevap: Mümkün ve özel bir HTTP proxy'si veya bir SOCKS proxy'si ile yapılabilir.

Öncelikle ve en önemlisi, HTTPS, güvenli olmayan bir iletişim kanalı üzerinden güvenli bir iletişim kanalı kurarak tasarım gereği uçtan uca güvenlik sağlayan SSL / TLS kullanır. HTTP proxy içeriği görebiliyorsa, ortadaki bir gizli dinleyicidir ve bu, SSL / TLS hedefini ortadan kaldırır. Dolayısıyla, düz bir HTTP proxy'si aracılığıyla proxy yapmak istiyorsak oynanmakta olan bazı hileler olmalıdır.

İşin püf noktası, bir HTTP proxy'yi, adlı özel bir komutla bir TCP proxy'sine dönüştürüyoruz CONNECT. Tüm HTTP proxy'leri bu özelliği desteklemez, ancak çoğu artık desteklemektedir. TCP proxy'si aktarılan HTTP içeriğini açık metin olarak göremez, ancak bu, paketleri ileri geri iletme yeteneğini etkilemez. Bu sayede istemci ve sunucu proxy yardımı ile birbirleriyle iletişim kurabilir. Bu, HTTPS verilerinde proxy oluşturmanın güvenli yoludur.

Ayrıca, HTTP proxy'nin ortadaki adam haline geldiği güvenli olmayan bir yol da vardır. İstemci tarafından başlatılan bağlantıyı alır ve ardından gerçek sunucuya başka bir bağlantı başlatır. İyi uygulanan bir SSL / TLS'de, istemciye proxy'nin gerçek sunucu olmadığı bildirilecektir. Bu yüzden müşteri, işlerin çalışması için uyarıyı görmezden gelerek proxy'ye güvenmelidir. Bundan sonra, proxy basitçe bir bağlantıdaki verilerin şifresini çözer, yeniden şifreler ve diğerine besler.

Son olarak, SOCKS proxy'si daha düşük bir seviyede çalıştığı için HTTPS'yi bir SOCKS proxy'si aracılığıyla kesinlikle proxy yapabiliriz . SOCKS proxy'sini hem TCP hem de UDP proxy olarak düşünebilirsiniz.


CONNECT kullanmak, stackoverflow.com/a/3118759/632951 adresinde belirtildiği gibi güvenlik uyarılarına neden olur mu?
Pacerier

@Pacerier Sanmıyorum. BAĞLAN modunda proxy, taşıma katmanında çalışır.
Cyker

Öyleyse, CONNECT yöntemiyle, istemciden gelen herhangi bir https verisi aracı proxy'nin uygulama düzeyine aktarılmaz mı? Ve sadece proxy'nin TCP seviyesinde değerlendirildi ve doğrudan uzak sunucuyaaktarıldı ?
zzinny

15

hatırlayabildiğim kadarıyla, proxy üzerinde bir HTTP CONNECT sorgusu kullanmanız gerekiyor. bu, istek bağlantısını şeffaf bir TCP / IP tüneline dönüştürür.

bu nedenle, kullandığınız proxy sunucunun bu protokolü destekleyip desteklemediğini bilmeniz gerekir.


3
Aslında istemciler, HTTP proxy sunucuları aracılığıyla https: // URI'leri kullanmak için CONNECT fiilini kullanır. Bu durumda, bağlantı proxy aracılığıyla tünellenir, böylece sertifika doğrulaması sanki istemci doğrudan son sunucuyla konuşuyormuş gibi her zamanki gibi yapılır.
Bruno

1
@chburd, ancak proxy'ler genellikle HTTP BAĞLANTISINI destekliyor mu?
Pacerier

9

Hala ilginizi çekiyorsa, işte benzer bir sorunun cevabı: Twisted'da HTTP Proxy'yi HTTPS Proxy'ye Dönüştür

Sorunun ikinci bölümünü cevaplamak için:

Varsa, ne tür bir proxy sunucusu buna izin veriyor?

Kutudan çıkar çıkmaz çoğu proxy sunucusu, HTTPS bağlantılarına yalnızca 443 numaralı bağlantı noktasına izin verecek şekilde yapılandırılacaktır, bu nedenle özel bağlantı noktalarına sahip https URI'leri çalışmayacaktır. Bu, proxy sunucusuna bağlı olarak genellikle yapılandırılabilir. Örneğin Squid ve TinyProxy bunu destekliyor.


5

İşte SOCKS proxy kullanarak hem HTTP hem de HTTPS isteklerini destekleyen tam Java kodum.

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);
        }
    }
}

3

Bunu, dinamik SSL üretimi ile ortadaki adam tekniklerini kullanarak gerçekleştirebilirsiniz. Mitmproxy'ye bir göz atın - bu Python tabanlı, SSL özellikli bir MITM proxy'dir.


3

HTTPS'yi SSH üzerinden tünelleme (linux sürümü):

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'ta yaptığınız her şey. sonra:

target_domain.com is accessible from localhost browser.

1

denedim

  • tünellemeye başla: ssh -N -D 12345 login@proxy_server
  • Firefox ayarlarında proxy'yi şu şekilde ayarlama: localhost:12345
    • ve "bu proxy'yi tüm protokoller için kullan" seçeneğini işaretleyin

ancak bu, bir https web sitesine bağlanmaya çalıştığımda "Güvenli olmayan bağlantı" hatasıyla sonuçlandı.

Çözüm şöyleydi:

  • "tüm protokoller için bu proxy'yi kullan" seçeneğinin "işaretini kaldırın"
  • "localhost: 12345" proxy'sini yalnızca SOCKS proxy'si olarak ayarlayın
  • ve HTTP proxy, SSL proxy, FTP proxy'yi boş bırakın

Dijital okyanus belgelerinden referans

SOCKS Tüneli Kullanarak VPN Olmadan Web Trafiğini Güvenli Bir Şekilde Yönlendirme


1

"Proxy sunucular üzerinden HTTPS bağlantıları var" ın, Proxy sunucusunun Man-in-the-Middle saldırı türü anlamına geldiğini düşünmüyorum. Sanırım TLS üzerinden bir http proxy sunucusuna bağlanıp bağlanamayacağını soruyor. Cevap evet.


Proxy sunucular üzerinden HTTPS bağlantılarına sahip olmak mümkün müdür?

Evet, sorumu ve cevabımı burada görün. HTTPs proxy sunucusu yalnızca SwitchOmega'da çalışır

Varsa, ne tür bir proxy sunucusu buna izin veriyor?

Proxy sunucusu türü, sıradan web sitelerinin yaptığı gibi SSL sertifikaları dağıtır. Ancak pactarayıcının, SSL üzerinden proxy bağlantısını yapılandırması için bir dosyaya ihtiyacınız var .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.