2017-10-30 92 views
6

Próbuję skonfigurować serwer proxy Apache Forward, który zakończy połączenie SSL. Powodem, dla którego próbuję to zrobić, jest uruchomienie filtrów Apache (w szczególności: mod_pagespeed) w zwracanym kodzie. Zanim zajmuję się mod_pagespeed, testuję ten POC, próbując wstawić nagłówek do odpowiedzi (co udowodni, że mogę edytować odpowiedź), ale mam problemy z proxy SSL (nie proxy SSL działa bez zarzutu) .Serwer proxy Apache z zakończeniem SSL

Należy zauważyć, że nie przejmuję się żadnymi błędami certyfikatów lub tym podobnymi - dotyczy to wyłącznie testów wewnętrznych.

Mam serwer skonfigurować i zobaczyć X-MSCProxy Nagłówek na stronie: non-SSL

jshannon-macbookpro:pagespeed_proxy jshannon$ curl -vv --proxy pagespeed_proxy:[email protected]:8080 -D - -o /dev/null http://www.slate.com 

* TCP_NODELAY set 
* Connected to localhost (::1) port 8080 (#0) 
* Proxy auth using Basic with user 'pagespeed_proxy' 
> GET http://www.slate.com/ HTTP/1.1 
> Host: www.slate.com 
... 
> 
< HTTP/1.1 200 OK 
HTTP/1.1 200 OK 
< Date: Mon, 30 Oct 2017 18:10:40 GMT 
Date: Mon, 30 Oct 2017 18:10:40 GMT 
< Server: Apache/2.2.29 (Amazon) 
Server: Apache/2.2.29 (Amazon) 
... 
< Content-Length: 187051 
Content-Length: 187051 
... 
< X-Instart-Request-ID: 8286987369135064135:FWP01-NPPRY22:1509387040:0 
X-Instart-Request-ID: 8286987369135064135:FWP01-NPPRY22:1509387040:0 
< Via: 1.1 172.17.0.2:8080 
Via: 1.1 172.17.0.2:8080 
< X-MSCProxy: SansPS 
X-MSCProxy: SansPS 

Ale kiedy robię ten sam wniosek do strony SSL Slate za nie widzę mój pełnomocnik:

jshannon-macbookpro:pagespeed_proxy jshannon$ curl -vv --proxy pagespeed_proxy:[email protected]:8080 -D - -o /dev/null https://www.slate.com 

* Connected to localhost (::1) port 8080 (#0) 
* Establish HTTP proxy tunnel to www.slate.com:443 
* Proxy auth using Basic with user 'pagespeed_proxy' 
> CONNECT www.slate.com:443 HTTP/1.1 
> Host: www.slate.com:443 

< HTTP/1.0 200 Connection Established 
HTTP/1.0 200 Connection Established 
< Proxy-agent: Apache/2.4.25 (Debian) 
Proxy-agent: Apache/2.4.25 (Debian) 
< 

* Proxy replied OK to CONNECT request 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 
* Server certificate: ssl004.insnw.net 
* Server certificate: GlobalSign CloudSSL CA - SHA256 - G3 
* Server certificate: GlobalSign Root CA 
> GET/HTTP/1.1 
> Host: www.slate.com 
> User-Agent: curl/7.54.0 
> Accept: */* 
> 

< Content-Length: 187044 
Content-Length: 187044 
< Connection: keep-alive 
Connection: keep-alive 
< Server: Apache/2.2.29 (Amazon) 
Server: Apache/2.2.29 (Amazon) 
< X-Instart-Request-ID: 762420041708891440:FWP01-NPPRY21:1509387251:0 
X-Instart-Request-ID: 762420041708891440:FWP01-NPPRY21:1509387251:0 

Znalazłem wiele stanowisk, które twierdzą, że to możliwe (i technicznie powinno być) z różnymi sugestiami httpd.conf, ale nic próbowałem pracował. Teraz mój httpd.conf wygląda następująco:

<VirtualHost *:8080> 
    ProxyRequests On 
    ProxyVia On 

    Header set X-MSCProxy SansPS 

    #SSLEngine On 
    # suggestion that this allows termination 
    ProxyPreserveHost On 

    SSLProxyEngine on 
    SSLProxyCheckPeerCN Off 
    SSLProxyCheckPeerExpire Off 
    SSLProxyCheckPeerName Off 

    SSLCertificateFile /etc/apache2/ssl/localhost.crt 
    SSLCertificateKeyFile /etc/apache2/ssl/localhost.key 

    ModPagespeed Off 
</VirtualHost> 

FWIW, kiedy pozwalają na to SSLEngine proxy (jak sugerowano), a następnie wniosek po prostu nie działa z tego błędu z Apache:

[Mon Oct 30 18:20:20.705047 2017] [ssl:info] [pid 372:tid 140147985901312] [client 172.17.0.1:34012] AH01996: SSL handshake failed: HTTP spoken on HTTPS port; trying to send HTML error page 
[Mon Oct 30 18:20:20.705107 2017] [ssl:info] [pid 372:tid 140147985901312] SSL Library Error: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request -- speaking HTTP to HTTPS port!? 

Co wydaje mi się sensowne, ponieważ protokół proxy nie oczekuje połączenia HTTPS bezpośrednio z serwerem proxy.

+1

To nie jest możliwe z dowolnego typowego klienta za parę powodów. 1) klienci https nie rozmawiają z serwerami proxy na protokołach SSL, jak zauważyłeś. 2) Nawet jeśli klient używał protokołu HTTPS do proxy, nadal używa https przez ustanowiony tunel CONNECT, aby serwer pośredniczący nie był w stanie odczytać żądań/odpowiedzi HTTP przez niego do manipulacji. Wygląda jak ślepy zaułek. – covener

+0

Ok. Dzięki za potwierdzenie. –

+0

Co powiesz na to, że nie używasz go jako serwera proxy, ale używasz pliku hosta do wskazania domeny serwerowi apache, a następnie serwerowi proxy przekazując żądanie do oryginalnego serwera? Działa to, ponieważ będziesz miał 'https (adres IP domeny zmieniony przy użyciu pliku hosta) -> Apache -> https w oryginalnej witrynie' –

Odpowiedz

0

Chciałbym spróbować użyć filtru wyjściowego feautre fom apache.

https://www.modpagespeed.com/doc/configuration#apache_specific

AddOutputFilterByType MOD_PAGESPEED_OUTPUT_FILTER text/html

+0

Jak to rozwiązałoby problemy z możliwością zakończenia proxy SSL? Bez zakończenia (tzn. Jeśli Apache po prostu przechodzi przez żądanie za pomocą polecenia CONNECT), moduły są całkowicie niezdolne do filtrowania. –

+0

Ponieważ chcesz użyć mod_pagespeed, możesz spróbować użyć filtra. Nie wiem, dlaczego chcesz stworzyć rozwiązanie mitmowe, może tylko dla strony, która jest przyczyną mojej sugestii dla filtra. – Aleksandar