it-swarm-vi.tech

Apache Virtualhost với mod-proxy và SSL

Tôi đang cố gắng thiết lập một máy chủ có nhiều ứng dụng web, tất cả sẽ được phục vụ thông qua Apache Virtualhost (Apache chạy trên cùng một máy chủ). Hạn chế chính của tôi là mỗi ứng dụng web phải sử dụng mã hóa SSL. Sau khi googling một lúc và xem xét các câu hỏi khác trên stackoverflow, tôi đã viết cấu hình sau cho Virtualhost:

<VirtualHost 1.2.3.4:443>
    ServerName Host.example.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

Mặc dù https://host.example.org:844 có thể truy cập được, https://host.example.org không, điều đó đánh bại mục đích của Máy chủ ảo của tôi cấu hình. Firefox phàn nàn rằng, mặc dù đã kết nối thành công với máy chủ, kết nối đã bị gián đoạn. Tôi cũng nhận được cảnh báo sau trong lỗi của Apache.log:

proxy: no HTTP 0.9 request (with no Host line) on incoming request and preserve Host set forcing hostname to be Host.example.org for uri 

Trên ứng dụng web (máy chủ Tomcat) nhật ký truy cập hiển thị yêu cầu truy cập lạ:

"?O^A^C / HTTP/1.1" 302

Sau đây là lần truy cập chính xác mà tôi nhận được khi kết nối trực tiếp với https://host.example.org:844 :

"GET / HTTP/1.1" 302

Cuối cùng tôi cũng nên đề cập rằng Máy chủ ảo hoạt động hoàn toàn tốt khi tôi không sử dụng SSL.

Làm thế nào tôi có thể làm cho công việc này?

28
JMD

Cuối cùng tôi tìm thấy một cách để làm cho nó hoạt động. Đầu tiên tôi đã thử đề xuất của Dave Cheney, vì vậy tôi đã cài đặt một chứng chỉ khác cho máy chủ Apache được chuyển hướng đến cổng không SSL của Tomcat (vì vậy proxy đã chuyển hướng đến http: // localhost: 8080 / ). Thật không may, nó không hoạt động hoàn toàn như trong trình duyệt web, https đã được chuyển thành http ngay khi kết nối. Vì vậy, tôi đã quay trở lại sử dụng https: // localhost: 8443 / và lần chạm cuối cùng để làm cho nó hoạt động là thêm lại SSLProxyEngine.

Đây là cấu hình Virtualhost kết quả:

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLEngine on
    SSLProxyEngine On
    SSLCertificateFile /etc/Apache2/ssl/certificate.crt
    SSLCertificateKeyFile /etc/Apache2/ssl/certificate.key

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>
35
JMD

Hãy thử cấu hình này

<VirtualHost 1.2.3.4:443>
    ServerName Host.domain.org

    SSLEngine On
    # include other ssl options, like cert and key here

    ProxyRequests Off
    ProxyPreserveHost On

    <Location />
        ProxyPass http://localhost:8443/
    </Location>
</VirtualHost>

Nếu ứng dụng của bạn cần có quyền truy cập vào thông tin SSL từ kết nối được ủy quyền, bạn nên xem xét sử dụng mod_proxy_ajp và trình kết nối Tomcat ajp1.3.

4
Dave Cheney

Nhưng nếu mục tiêu của bạn là chạy nhiều ứng dụng web kích hoạt ssl trên cùng một máy chủ. thêm Apache ở phía trước sẽ không cân bằng chúng bằng cách sử dụng cấu hình trên của bạn, bạn vẫn sẽ cần một bộ cân bằng tải hoặc bạn có thể sử dụng mô-đun cân bằng proxy của Apache với một cái gì đó như sau:

ProxyRequests Off

<Proxy balancer://someapplication>
    BalancerMember http://127.0.0.1:18443 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18444 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18445 keepalive=on max=2 retry=30
</Proxy>


<VirtualHost 1.2.3.4:443>
    SSLEngine on
    SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile //path/to/key.pem
    SSLVerifyClient optional

    RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

<Location />
    SetHandler balancer-manager
    Order allow,deny
    Allow from all
</Location>

ProxyPass / balancer://someapplication:443/
ProxyPassReverse / balancer://someapplication:443/
ProxyPreserveHost on
2
Brendan

Chà, điều tôi không hiểu ở đây là tại sao bạn cần phải có kết nối SSL từ Apache đến ứng dụng của bạn dường như trên cùng một máy ( http: // localhost: 8443 / ).

Tôi đoán cách thông thường để thiết lập những thứ như thế này là để Apache cung cấp mã hóa SSL cho phía "khách hàng", ví dụ: internet và có kết nối không được mã hóa đến ứng dụng. Điều này cũng cho phép bạn tự do hơn để gỡ lỗi các phản ứng ứng dụng của bạn.

Một điều khác Dave Cheney đã đề cập là sử dụng trình kết nối Tomcat bản địa để có sự cân bằng tải và các tính năng khác.

1
zero_r

Bạn có thực sự cần phải ủy quyền cho dịch vụ HTTPS không? Bạn có thể muốn ủy quyền cho dịch vụ không ssl trong localhost, ví dụ:.

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
0
codehead

Đầu tiên tôi sẽ xem xét nếu bạn có thể thực hiện một yêu cầu từ localhost đến localhost: 8443 và xem điều đó có thành công không (IE thực hiện GET hoặc wget http: // localhost: 844 )

Tôi không chắc chắn lý do tại sao máy chủ ảo của bạn lại nghe trên cổng 443 sau đó ủy quyền cho máy chủ ssl khác

tại sao ứng dụng không thể sử dụng 443 hữu cơ? Nếu bạn không thể thay đổi, bạn chỉ có thể sử dụng iptables để chuyển hướng cổng

0
Brendan

Kiểm tra nhật ký lỗi SSL của bạn và đảm bảo rằng bạn không có lỗi về việc không thể xác minh chuỗi chứng chỉ CA.

0
Neobyte