HTTPS-verbindingen via proxy-servers

Is het mogelijk om HTTPS-verbindingen over proxy-servers te hebben? Zo ja, wat voor soort proxyserver dit toestaat?

Duplicated with Hoe sokken 5 te gebruiken Proxy met Apache HTTP-client 4?


Antwoord 1, Autoriteit 100%

TLS / SSL (de S in HTTPS) garandeert dat er geen afluisteringen tussen u en de server waarop u contact maakt, d.w.z. geen proxies. Normaal gesproken gebruikt u CONNECTom een ​​TCP te openen verbinding via de proxy. In dit geval kan de proxy niet in staat zijn om eventuele aanvragen / reacties te cachen, te lezen of te wijzigen, en daarom nogal nutteloos zijn.

Als u wilt dat de proxy informatie kan lezen, kunt u de volgende aanpak nemen:

  1. Client start HTTPS SESSIE
  2. proxy onderschept transparant de verbinding en
    Retourneert een gegenereerde ad-hoc (mogelijk
    Zwak) Certificaat K A ,
    ondertekend door een certificaatautoriteit
    dat is onvoorwaardelijk vertrouwd door
    de klant.
  3. Proxy start HTTPS-sessie om te targeten
  4. proxy verifieert integriteit van SSL
    certificaat; Geeft de fout weer of de
    CERT is niet geldig.
  5. proxy streams inhoud, decodeert het
    en versleutelt het opnieuw met
    K a
  6. Client geeft dingen weer

Een voorbeeld is inktvis SSL Bump . Evenzo, Burp kan worden geconfigureerd om dit te doen. Dit is ook Gebruikt in een minder goedaardige context door een Egyptische ISP .

Merk op dat moderne websites en browsers HPKP of ingebouwde certificaat pins die deze aanpak verslaan.


Antwoord 2, Autoriteit 38%

Het korte antwoord is: het is mogelijk en kan worden gedaan met een speciale HTTP-proxy of een sokkenproxy.

Eerste en vooral, HTTPS gebruikt SSL / TLS die per ontwerp voor een eind-tot-end beveiliging garandeert door een veilig communicatiekanaal te vestigen over een onzekere. Als de HTTP-proxy in staat is om de inhoud te zien, dan is het een man-in-the-middle afluisteren en deze verslaat het doel van SSL / TLS. Dus er moeten enkele trucs worden gespeeld als we willen proxy via een gewone HTTP-proxy.

De truc is, wij maken een HTTP-proxy in een TCP-proxy met een speciaal commando met de naam CONNECT. Niet alle HTTP-proxies ondersteunen deze functie, maar velen doen nu. De TCP-proxy kan niet zien dat de HTTP-inhoud in duidelijke tekst wordt overgedragen, maar dat heeft geen invloed op het vermogen om pakketten heen en weer door te sturen. Op deze manier kunnen klant en server met elkaar communiceren met behulp van de proxy. Dit is de veilige manier van proxying https-gegevens.

Er is ook een onzekere manier om dit te doen, waarin de HTTP-proxy een man-in-het-midden wordt. Het ontvangt de opdrachtgever-geïnitieerde verbinding en start vervolgens een andere verbinding met de echte server. In een goed geïmplementeerde SSL / TLS wordt de klant op de hoogte gebracht dat de proxy niet de echte server is. Dus de klant moet de proxy vertrouwen door de waarschuwing te negeren voor dingen om te werken. Daarna decodeert de proxy eenvoudig gegevens van de ene verbinding, hercrypts en voedt het in de andere.

Ten slotte kunnen we zeker een proxy https via een sokken proxy, omdat de sokken proxy werkt een lager niveau. Misschien denk je dat een sokken proxy als zowel een TCP als een UDP-proxy.


Antwoord 3, Autoriteit 21%

Voor zover ik kan onthouden, moet u een HTTP Connect-query op de proxy gebruiken. Dit zal de aanvraagverbinding converteren op een transparante TCP / IP-tunnel.

Dus je moet weten of de proxyserver die je gebruikt dit protocol ondersteunt.


Antwoord 4, Autoriteit 12%

Als het nog steeds van belang is, is hier een antwoord op een soortgelijke vraag:
Converteer HTTP-proxy naar HTTPS-proxy in gedraaid

Om het tweede deel van de vraag te beantwoorden:

Zo ja, wat voor soort proxyserver
Hiermee staat dit toe?

Uit de doos worden de meeste proxyservers geconfigureerd om HTTPS-verbindingen alleen toe te staan ​​op poort 443, dus HTPS URI’s met aangepaste poorten zou niet werken. Dit is over het algemeen configureerbaar, afhankelijk van de proxyserver. Inktvis en tinyProxy ondersteunen dit bijvoorbeeld.


Antwoord 5, Autoriteit 7%

Hier is mijn volledige Java-code die zowel HTTP- als HTTPS-aanvragen ondersteunt met behulp van SOCKS-proxy.

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

Antwoord 6, autoriteit 5%

U kunt dit bereiken met behulp van man-in-the-middle-technieken met dynamische SSL-generatie. Bekijk mitmproxy– het is een op Python gebaseerde, SSL-compatibele MITM-proxy.


Antwoord 7, autoriteit 4%

HTTPS tunnelen via SSH (linux-versie):

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

alles wat je doet op localhost.
dan:

target_domain.com is accessible from localhost browser.

Antwoord 8, autoriteit 3%

Ik denk niet dat “HTTPS-verbindingen via proxyservers” het Man-in-the-Middle-aanvalstype van de proxyserver betekent. Ik denk dat het vraagt of men via TLS verbinding kan maken met een http-proxyserver. En het antwoord is ja.


Is het mogelijk om HTTPS-verbindingen te hebben via proxyservers?

Ja, zie mijn vraag en antwoord
hier. HTTPs-proxyserver werkt alleen in SwitchOmega

Zo ja, wat voor soort proxyserver staat dit toe?

Het soort proxyserver dat SSL-certificaten gebruikt, zoals gewone websites dat doen. Maar je hebt een pac-bestand nodig voor de browser om de proxyverbinding via SSL te configureren.


Antwoord 9

Ik had het geprobeerd

  • start tunneling: ssh -N -D 12345 login@proxy_server
  • De proxy in de Firefox-instellingen instellen als localhost:12345
    • en “gebruik deze proxy voor alle protocollen” aanvinken

maar dit resulteerde in de foutmelding “Onveilige verbinding” telkens wanneer ik probeerde verbinding te maken met een https-website.

De oplossing was om

  • “uitvinken” de “gebruik deze proxy voor alle protocollen”
  • stel de proxy “localhost:12345” alleen in als een SOCKS-proxy
  • en laat de HTTP-proxy, SSL-proxy, FTP-proxy leeg

Referentie van Digital Ocean Documentation

Hoe het webverkeer veilig te routeren zonder een VPN met behulp van een sokkentunnel

Other episodes