Proxy sunucular üzerinden HTTPS bağlantılarına sahip olmak mümkün müdür? Varsa, ne tür bir proxy sunucusu buna izin veriyor?
İle Yinelendi Apache HTTP Client 4 ile Çorap 5 vekil nasıl kullanılır?
Proxy sunucular üzerinden HTTPS bağlantılarına sahip olmak mümkün müdür? Varsa, ne tür bir proxy sunucusu buna izin veriyor?
İle Yinelendi Apache HTTP Client 4 ile Çorap 5 vekil nasıl kullanılır?
Yanıtlar:
TLS / SSL (HTTPS'deki S), sizinle iletişim kurduğunuz sunucu arasında gizli dinleyici olmadığını, yani proxy bulunmadığını garanti eder. Normalde, CONNECT
proxy 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:
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 .
Unconditionally trusted
bir 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.
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.
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.
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.
İş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);
}
}
}
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.
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.
denedim
ssh -N -D 12345 login@proxy_server
localhost:12345
ancak bu, bir https web sitesine bağlanmaya çalıştığımda "Güvenli olmayan bağlantı" hatasıyla sonuçlandı.
Çözüm şöyleydi:
Dijital okyanus belgelerinden referans
SOCKS Tüneli Kullanarak VPN Olmadan Web Trafiğini Güvenli Bir Şekilde Yönlendirme
"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 pac
tarayıcının, SSL üzerinden proxy bağlantısını yapılandırması için bir dosyaya ihtiyacınız var .