2017-10-30 39 views
6

Tôi đang cố gắng thiết lập Proxy chuyển tiếp Apache chấm dứt kết nối SSL. Lý do tôi đang cố gắng làm điều này là chạy bộ lọc Apache (cụ thể là mod_pagespeed) trên mã trả lại. Trước khi tôi xử lý mod_pagespeed, tôi đang thử POC này bằng cách cố gắng chèn tiêu đề vào phản hồi (điều này chứng minh rằng tôi có thể chỉnh sửa phản hồi), nhưng tôi gặp sự cố với proxy SSL (proxy không phải SSL hoạt động tốt) .Proxy chuyển tiếp Apache có chấm dứt SSL

Lưu ý rằng tôi không quan tâm đến bất kỳ lỗi chứng chỉ nào hoặc các loại tương tự - đây hoàn toàn là thử nghiệm nội bộ.

Tôi đã có máy chủ thiết lập và xem X-MSCProxy Tiêu đề trên một trang không có 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 

Nhưng khi tôi thực hiện cùng một yêu cầu trang SSL Slate của tôi không thấy tôi proxy:

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 

tôi đã tìm thấy rất nhiều bài viết mà nói điều này là có thể (và, về mặt kỹ thuật, nó phải là) với các đề xuất httpd.conf khác nhau, nhưng không có gì tôi đã cố gắng đã làm việc. Ngay bây giờ httpd.conf của tôi trông giống như:

<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, khi tôi cho phép SSLEngine trên proxy này (như đã được gợi ý) sau đó yêu cầu chỉ đơn giản là không làm việc với lỗi này từ 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!? 

Tôi cho là có ý nghĩa vì giao thức proxy không mong đợi kết nối HTTPS trực tiếp đến proxy.

+1

Nó không thể xảy ra với bất kỳ khách hàng điển hình cho một cặp lý do. 1) Khách hàng https không nói chuyện với proxy cấp trên SSL, như bạn đã thấy. 2) Ngay cả khi khách hàng của bạn sử dụng https với proxy, nó vẫn sẽ sử dụng https thông qua đường hầm CONNECT đã được thiết lập để proxy không thể xem được yêu cầu/phản hồi HTTP thông qua thao tác đó. Dường như tôi đã chết. – covener

+0

Ok. Cám ơn vì đã xác nhận. –

+0

Làm thế nào về việc không sử dụng nó như là một proxy nhưng sử dụng một tập tin máy chủ để trỏ tên miền đến máy chủ apache và sau đó proxy chuyển yêu cầu đến sever ban đầu? Điều này hoạt động bởi vì bạn sẽ có một 'https (tên miền IP thay đổi bằng cách sử dụng tập tin host) -> Apache -> https trên trang web gốc ' –

Trả lời

0

Tôi sẽ cố gắng sử dụng bộ lọc đầu ra feautre fom apache.

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

AddOutputFilterByType MOD_PAGESPEED_OUTPUT_FILTER text/html

+0

Làm cách nào để giải quyết vấn đề với việc có thể chấm dứt proxy SSL? Nếu không có kết thúc (ví dụ, nếu Apache chỉ đơn giản là đi qua yêu cầu thông qua một lệnh CONNECT) thì các mô-đun hoàn toàn không thể lọc. –

+0

Vì bạn muốn sử dụng mod_pagespeed, bạn có thể thử sử dụng bộ lọc. Tôi không biết tại sao bạn muốn tạo ra giải pháp mitm có thể chỉ dành cho pagepeed là lý do cho đề xuất của tôi cho bộ lọc. – Aleksandar

Các vấn đề liên quan