प्रॉक्सी सर्वर पर HTTPS कनेक्शन


103

क्या प्रॉक्सी सर्वर पर HTTPS कनेक्शन होना संभव है? यदि हाँ, तो प्रॉक्सी सर्वर किस तरह की अनुमति देता है?

साथ दोहराए कैसे अपाचे HTTP क्लाइंट 4 के साथ जुराबें 5 प्रॉक्सी का उपयोग करने?


मुझे लगता है कि इसे stackoverflow.com/questions/22937983/…
Uri

हाँ, यह संभव है। यहां पर व्यावहारिक उदाहरण देखें stackoverflow.com/questions/56981993/…
रिक

जवाबों:


66

TLS / SSL (HTTPS में S) इस बात की गारंटी देता है कि आपके और आपके द्वारा संपर्क किए जा रहे सर्वर के बीच कोई ईवेस्‍ड्रॉपर नहीं हैं, यानी कोई प्रॉक्सी नहीं है। आम तौर पर, आप CONNECTप्रॉक्सी के माध्यम से एक टीसीपी कनेक्शन खोलने के लिए उपयोग करते हैं। इस स्थिति में, प्रॉक्सी किसी भी अनुरोध / प्रतिक्रियाओं को कैश करने, पढ़ने या संशोधित करने में सक्षम नहीं होगा, और इसलिए बेकार हो सकता है।

यदि आप चाहते हैं कि प्रॉक्सी सूचना पढ़ने में सक्षम हो, तो आप निम्नलिखित दृष्टिकोण अपना सकते हैं:

  1. क्लाइंट HTTPS सत्र शुरू करता है
  2. प्रॉक्सी पारदर्शी रूप से कनेक्शन को स्वीकार करता है और एक प्रमाणिक प्राधिकारी द्वारा हस्ताक्षरित एक (संभवतः कमजोर) प्रमाण पत्र K , a , जो ग्राहक द्वारा बिना शर्त भरोसा किया जाता है, देता है।
  3. लक्ष्य के लिए प्रॉक्सी HTTPS सत्र शुरू करता है
  4. प्रॉक्सी SSL प्रमाणपत्र की अखंडता की पुष्टि करता है; यदि प्रमाणपत्र मान्य नहीं है तो त्रुटि प्रदर्शित करता है।
  5. प्रॉक्सी सामग्री को स्ट्रीम करता है, इसे डिक्रिप्ट करता है और K के साथ फिर से एनक्रिप्ट करता है
  6. ग्राहक सामान प्रदर्शित करता है

एक उदाहरण स्क्विड का एसएसएल बम्प है । इसी तरह, burp को ऐसा करने के लिए कॉन्फ़िगर किया जा सकता हैमिस्र के आईएसपी द्वारा कम-सौम्य संदर्भ में भी इसका उपयोग किया गया है

ध्यान दें कि आधुनिक वेबसाइट और ब्राउज़र HPKP या बिल्ट-इन सर्टिफिकेट पिंस को नियोजित कर सकते हैं जो इस दृष्टिकोण को पराजित करते हैं।


13
यह सिद्धांत रूप में काम कर सकता है, लेकिन यह एचटीटीपीएस अनुरोधों के लिए ब्राउज़र HTTP प्रॉक्सी से बात करने का तरीका नहीं है। जिस तरह से यहाँ वर्णित किया गया है, उसका तात्पर्य है कि प्रॉक्सी सर्वर प्रभावी रूप से एक मैन-इन-द-मिडिल है (इसलिए इसके अनुसार भरोसा करना होगा)।
ब्रूनो

5
स्क्विड ऐसा करता है। इसे SSL Bump कहा जाता है ।
एडम मैकलर

3
उपयोगकर्ता को समाप्त करने के लिए बहुत सारे काम नहीं करेंगे। "ग्राहक द्वारा बिना शर्त भरोसा किया" - ऐसी कोई बात नहीं है। यहां तक ​​कि सर्टिफिकेट सही-एएए +++ है, यह अभी भी अलग-अलग डोमेन को दिखाता है कि उपयोगकर्ता ने किसके लिए क्या नहीं पूछा, जो कि किसी भी ब्राउज़र को सुरक्षित कर देगा (जिसका अर्थ यहां IE नहीं है ...) ऊपर और नीचे चिल्ला रहा है। बेशक, SSL जांच को अक्षम करने वाले मापदंडों के साथ wget का उपयोग करना संभव है, लेकिन लगता है क्या? कोर सुरक्षा जाँच अक्षम होने के बाद इस कनेक्शन को "SSL" नाम नहीं दिया जा सकता है।
वैन जोंन

1
@Van जौन Unconditionally trustedएक सीए प्रमाणपत्र को संदर्भित करता है। CA certs के पास डोमेन नहीं है। मैंने दो उदाहरणों के साथ उत्तर में संशोधन किया है जहां यह उपयोगकर्ता के लिए किसी भी अलर्ट के बिना अभ्यास करता है।
फ़िहग

6
मेरा जवाब उस पर निर्भर करता है जिसे आप "फर्जी सीए" कहते हैं। सीए का प्रमाण पत्र है बिना शर्त भरोसा, क्योंकि या तो उपयोगकर्ता (या अपने कंप्यूटर पर सॉफ्टवेयर, उदाहरण के उद्यम विन्यास या मैलवेयर के लिए) इसे उस तरह से कॉन्फ़िगर किया गया, या क्योंकि सीए सीए में से एक से प्राप्त हुई थी प्रमुख ब्राउज़रों, द्वारा विश्वसनीय तरह MCS मामले में। प्रॉक्सी क्लाइंट के अनुरोधों के लिए हर डोमेन के लिए एक नया वैध प्रमाण पत्र बनाता है, इसलिए उत्तर के अंत में उल्लेखित एंटी-एमआईटीएम सुविधाओं के बिना ग्राहक को नोटिस नहीं होगा।
फाहीग

23

संक्षिप्त उत्तर है: यह संभव है, और विशेष HTTP प्रॉक्सी या SOCKS प्रॉक्सी के साथ किया जा सकता है।

सबसे पहले और सबसे पहले, HTTPS SSL / TLS का उपयोग करता है जो डिज़ाइन द्वारा असुरक्षित सुरक्षा पर एक सुरक्षित संचार चैनल की स्थापना करके एंड-टू-एंड सुरक्षा सुनिश्चित करता है। यदि HTTP प्रॉक्सी सामग्री को देखने में सक्षम है, तो यह एक मध्य-मध्य ईव्सड्रोपर है और यह SSL / TLS के लक्ष्य को पराजित करता है। अगर हम एक सादे HTTP प्रॉक्सी के माध्यम से प्रॉक्सी करना चाहते हैं तो कुछ चालें चलनी चाहिए।

चाल है, हम एक HTTP प्रॉक्सी को एक विशेष कमांड नाम के साथ एक टीसीपी प्रॉक्सी में बदलते हैं CONNECT। सभी HTTP प्रॉक्सी इस सुविधा का समर्थन नहीं करते हैं लेकिन कई अब करते हैं। टीसीपी प्रॉक्सी HTTP सामग्री को स्पष्ट पाठ में स्थानांतरित नहीं किया जा सकता है, लेकिन यह आगे और पीछे पैकेटों की क्षमता को प्रभावित नहीं करता है। इस तरह, क्लाइंट और सर्वर प्रॉक्सी की मदद से एक-दूसरे से संवाद कर सकते हैं। यह HTTPS डेटा को प्रॉक्सी करने का सुरक्षित तरीका है।

ऐसा करने का एक असुरक्षित तरीका भी है, जिसमें HTTP प्रॉक्सी एक व्यक्ति-मध्य बन जाता है। यह क्लाइंट-आरंभ किए गए कनेक्शन को प्राप्त करता है, और फिर वास्तविक सर्वर के लिए एक और कनेक्शन शुरू करता है। एक अच्छी तरह से लागू एसएसएल / टीएलएस में, क्लाइंट को सूचित किया जाएगा कि प्रॉक्सी वास्तविक सर्वर नहीं है। तो क्लाइंट को काम करने के लिए चेतावनी को अनदेखा करके प्रॉक्सी पर भरोसा करना होगा। उसके बाद, प्रॉक्सी बस एक कनेक्शन से डेटा को डिक्रिप्ट करता है, पुन: प्रयास करता है और इसे दूसरे में फीड करता है।

अंत में, हम निश्चित रूप से HTTPS को SOCKS प्रॉक्सी के माध्यम से प्रॉक्सी कर सकते हैं , क्योंकि SOCKS प्रॉक्सी निचले स्तर पर काम करती है। आप टीसीपी और यूडीपी दोनों प्रॉक्सी के रूप में एक सॉक्स प्रॉक्सी सोच सकते हैं।


जैसा कि stackoverflow.com/a/3118759/632951 में उल्लिखित सुरक्षा चेतावनियों का उपयोग करेगा ?
पचेरियर

@ स्पेसर मुझे ऐसा नहीं लगता। कनेक्ट मोड में प्रॉक्सी ट्रांसपोर्ट लेयर पर काम करता है।
साइकर

तो, CONNECT विधि से, क्लाइंट का कोई भी https डेटा मध्यस्थ प्रॉक्सी के आवेदन स्तर तक नहीं जाता है ? और बस प्रॉक्सी के टीसीपी स्तर पर मूल्यांकन किया गया और रिमोट सर्वर से सीधे रिले किया गया ?
zzinny

15

जहाँ तक मुझे याद है, आपको प्रॉक्सी पर एक HTTP कनेक्ट क्वेरी का उपयोग करने की आवश्यकता है। यह अनुरोध कनेक्शन को एक पारदर्शी टीसीपी / आईपी सुरंग में बदल देगा।

इसलिए आपको यह जानने की जरूरत है कि क्या प्रॉक्सी सर्वर आप इस प्रोटोकॉल का समर्थन करते हैं।


3
वास्तव में, क्लाइंट HTTP प्रॉक्सी सर्वर के माध्यम से https: // URI का उपयोग करने के लिए CONNECT क्रिया का उपयोग करते हैं। इस मामले में, कनेक्शन को प्रॉक्सी के माध्यम से ट्यून किया जाता है, इसलिए प्रमाणपत्र सत्यापन हमेशा की तरह किया जाता है, जैसे कि ग्राहक सीधे अंत सर्वर से बात कर रहा था।
ब्रूनो

1
@chburd, लेकिन क्या प्रॉक्सी आमतौर पर HTTP कनेक्शन का समर्थन करते हैं?
पचेरियर

9

यदि यह अभी भी रुचि है, तो यहां एक समान प्रश्न का उत्तर दिया गया है: एचटीटीपीएस को एचटीटीपीएस प्रॉक्सी में परिवर्तित करें

प्रश्न के दूसरे भाग का उत्तर देने के लिए:

यदि हाँ, तो प्रॉक्सी सर्वर किस तरह की अनुमति देता है?

बॉक्स से बाहर, अधिकांश प्रॉक्सी सर्वर केवल 443 पोर्ट के लिए HTTPS कनेक्शन की अनुमति देने के लिए कॉन्फ़िगर किए जाएंगे, इसलिए कस्टम पोर्ट के साथ https URI काम करेंगे। यह प्रॉक्सी सर्वर के आधार पर आमतौर पर विन्यास योग्य है। उदाहरण के लिए स्क्विड और टाइनीप्रॉक्सी इसका समर्थन करते हैं।


5

यहाँ मेरा पूरा जावा कोड है जो SOCKS प्रॉक्सी का उपयोग करके HTTP और HTTPS दोनों अनुरोधों का समर्थन करता है।

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

आप इसे गतिशील एसएसएल पीढ़ी के साथ मानव-में-मध्य तकनीकों का उपयोग करके पूरा कर सकते हैं। Mitmproxy पर नज़र डालें - यह एक पायथन आधारित, SSL- सक्षम MITM प्रॉक्सी है।


3

SSH (लिनक्स संस्करण) के माध्यम से HTTPS की सुरंग बनाना:

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

सब कुछ आप लोकलहोस्ट पर करते हैं। फिर:

target_domain.com is accessible from localhost browser.

1

मैंने कोशिश की थी

  • सुरंग बनाना शुरू करें: ssh -N -D 12345 login@proxy_server
  • के रूप में फ़ायरफ़ॉक्स सेटिंग्स में प्रॉक्सी सेट करना localhost:12345
    • और टिक "सभी प्रोटोकॉल के लिए इस प्रॉक्सी का उपयोग करें"

लेकिन जब भी मैं किसी https वेबसाइट से जुड़ने की कोशिश करता हूं, तो यह "असुरक्षित कनेक्शन" त्रुटि के कारण होता है।

का समाधान था

  • "untick" "सभी प्रोटोकॉल के लिए इस प्रॉक्सी का उपयोग करें"
  • प्रॉक्सी को "लोकलहोस्ट: 12345" पर केवल SOCKS प्रॉक्सी के रूप में सेट करें
  • और HTTP प्रॉक्सी, एसएसएल प्रॉक्सी, एफ़टीपी प्रॉक्सी को खाली छोड़ दें

डिजिटल महासागर प्रलेखन से संदर्भ

वीपीओ के बिना सुरक्षित रूप से वेब ट्रैफिक को कैसे रूट करें SOCKS टनल का उपयोग


1

मुझे नहीं लगता कि "प्रॉक्सी सर्वर पर HTTPS कनेक्शन हैं" का अर्थ है प्रॉक्सी सर्वर का मैन-इन-द-मिडल अटैक टाइप। मुझे लगता है कि यह पूछ रहा है कि क्या कोई टीएलएस पर http प्रॉक्सी सर्वर से जुड़ सकता है। और जवाब है हाँ।


क्या प्रॉक्सी सर्वर पर HTTPS कनेक्शन होना संभव है?

हां, मेरा प्रश्न और उत्तर यहां देखें। HTTP प्रॉक्सी सर्वर केवल SwitchOmega में काम करता है

यदि हाँ, तो प्रॉक्सी सर्वर किस तरह की अनुमति देता है?

प्रॉक्सी सर्वर का प्रकार एसएसएल प्रमाणपत्रों को दर्शाता है, जैसे कि सामान्य वेबसाइटें कैसे करती हैं। लेकिन pacएसएसएल पर प्रॉक्सी कनेक्शन को कॉन्फ़िगर करने के लिए आपको ब्रॉयर के लिए एक फ़ाइल की आवश्यकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.