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.
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
Ok. Dzięki za potwierdzenie. –
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' –