Apache Virtualhost với mod-proxy và SSL


28

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:8443 có thể truy cập được, nhưng https://host.example.org thì không, điều này đánh bại mục đích cấu hình máy chủ ảo của tôi. 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:8443 :

"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?

Câu trả lời:


34

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 Tomcat không SSL (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 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 SSLProxyEngine một lần nữa.

Đâ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>

1
Tránh ProxyPreserveHost Onnó hầu như luôn luôn sai, vô dụng và hầu như luôn luôn phá vỡ ProxyPassReverse. Như một lưu ý phụ ProxyRequests offlà mặc định, do đó, dư thừa.
kubanchot

Khi chúng tôi sử dụng IP bên ngoài thay vì localhostnó không hoạt động.
Chaminda Bandara

4

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.


Tôi sẽ tạo chứng chỉ với mã hóa trên máy chủ nơi ứng dụng cho host.domain.org đang chạy. Sau đó tôi phải sử dụng lại chứng chỉ tương tự trên máy chủ proxy?
Giox

2

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

Hiện tại tôi không thực sự cần sử dụng cân bằng tải, nhưng điều đó có thể gây hại trong tương lai. Cảm ơn vì sự sáng suốt.
JMD

1

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à có apache cung cấp mã hóa SSL cho phía "khách hàng", ví dụ như internet và có kết nối không được mã hóa với ứ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.


Vâng, tôi có hai lý do để chọn một thiết lập như vậy. Đầu tiên là máy chủ Tomcat đã hoạt động và chạy SSL và tôi nghĩ sẽ rất đơn giản khi sử dụng apache Virtualhost với nó. Thứ hai là nhà cung cấp ứng dụng (JIRA) cung cấp một số hướng dẫn về tích hợp apache ( atlassian.com/software/jira/docs/v3.13/apacheintegration.html ) và tôi dựa trên cấu hình của mình bằng cách thêm hỗ trợ Virtualhost. Đoán nó phức tạp hơn tôi nghĩ, ngoài việc làm cho nó hoạt động tôi thực sự muốn hiểu vấn đề là gì.
JMD

0

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, vd

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

Thực sự sử dụng SSL là bắt buộc đối với tôi. Tôi cũng đã thử nghiệm proxy mà không sử dụng SSL chỉ để kiểm tra và nó hoạt động tốt. Hỗ trợ SSL là vấn đề thực sự.
JMD

0

Đầ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: 8443 )

Tôi không chắc tại sao máy chủ ảo havin ga của bạn 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


Lý do là tôi cần cài đặt thêm các ứng dụng web trên cùng một máy chủ, tất cả đều sử dụng SSL và tất cả chúng đều không thể nghe trên cổng 443. Vì vậy, tôi đang sử dụng Virtualhosts dựa trên IP để làm cho nó giống như mỗi ứng dụng web được lưu trữ trên máy chủ của chính nó. Tôi đã thử lệnh wget sau và nó hoạt động tốt: wget localhost: 8443 --no-check-
cert

2
Lưu ý - việc thêm địa chỉ IP bổ sung vào máy chủ của bạn là một vấn đề đơn giản và do đó có một số ứng dụng nghe trên cổng 443 - tất cả đều nằm trên các địa chỉ IP riêng biệt.
Brent

0

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.


Nếu thực sự có lỗi xác minh, giải pháp sẽ là gì?
Javier Méndez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.