it-swarm-id.com

Apache VirtualHost dengan mod-proxy dan SSL

Saya mencoba mengatur server dengan beberapa aplikasi web yang semuanya akan dilayani melalui Apache VirtualHost (Apache berjalan di server yang sama). Kendala utama saya adalah bahwa setiap aplikasi web harus menggunakan enkripsi SSL. Setelah googling sebentar dan melihat pertanyaan lain tentang stackoverflow, saya menulis konfigurasi berikut untuk 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>

Meskipun --- https://Host.example.org:844 dapat diakses, https://Host.example.org tidak, yang mengalahkan tujuan Host virtual saya konfigurasi. Firefox mengeluh bahwa, meskipun berhasil terhubung ke server, koneksi terputus. Saya juga mendapatkan peringatan berikut di error.log Apache:

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 

Pada aplikasi web (server Tomcat) log akses menunjukkan permintaan akses aneh:

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

Berikut ini adalah permintaan akses kembali yang benar yang saya dapatkan ketika saya terhubung langsung ke https://Host.example.org:844 :

"GET / HTTP/1.1" 302

Akhirnya saya juga harus menyebutkan bahwa Host virtual berfungsi dengan baik ketika saya tidak menggunakan SSL.

Bagaimana saya bisa membuat ini berfungsi?

28
JMD

Akhirnya saya menemukan cara untuk membuatnya bekerja. Pertama saya mencoba saran Dave Cheney, jadi saya menginstal sertifikat lain untuk server Apache yang dialihkan ke port Tomcat non SSL (jadi proxy diarahkan ke http: // localhost: 8080 / ). Sayangnya itu tidak sepenuhnya berfungsi karena di browser web https diubah menjadi http segera setelah koneksi. Jadi saya kembali menggunakan https: // localhost: 8443 / dan sentuhan terakhir untuk membuatnya berfungsi adalah menambahkan lagi SSLProxyEngine.

Berikut adalah konfigurasi VirtualHost yang dihasilkan:

<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

Coba konfigurasi ini

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

Jika aplikasi Anda perlu memiliki akses ke informasi SSL dari koneksi yang diproksi, Anda harus mempertimbangkan untuk menggunakan mod_proxy_ajp, dan konektor Tomcat ajp1.3.

4
Dave Cheney

Tetapi jika tujuan Anda adalah menjalankan beberapa aplikasi web yang diaktifkan ssl di server yang sama. menambahkan Apache di depan tidak akan menyeimbangkan mereka menggunakan konfigurasi di atas, Anda masih memerlukan load balancer atau Anda dapat menggunakan modul penyeimbang proxy Apache dengan sesuatu seperti berikut:

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

Nah, apa yang saya tidak mengerti di sini adalah mengapa Anda perlu memiliki koneksi SSL dari Apache Anda ke aplikasi Anda yang tampaknya berada di mesin yang sama ( http: // localhost: 8443 / ).

Saya kira cara biasa untuk mengatur hal-hal seperti ini adalah memiliki Apache yang menyediakan enkripsi SSL untuk sisi "pelanggan", mis. internet, dan memiliki koneksi yang tidak terenkripsi ke aplikasi. Ini juga memberi Anda lebih banyak kebebasan untuk men-debug respons aplikasi Anda.

Hal lain yang disebutkan Dave Cheney adalah menggunakan konektor Tomcat asli agar memiliki load balancing dan fitur lainnya.

1
zero_r

Apakah Anda benar-benar perlu proksi ke layanan HTTPS? Anda mungkin ingin proksi ke layanan non-ssl di localhost, mis.

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

Pertama saya akan melihat apakah Anda dapat melakukan permintaan dari localhost ke localhost: 8443 dan lihat apakah itu berhasil (IE melakukan GET atau wget http: // localhost: 844 )

Saya tidak begitu yakin mengapa Anda memiliki Host virtual mendengarkan pada port 443 kemudian proxy ke Host ssl lain

mengapa aplikasi tidak bisa hanya menggunakan 443 secara asli? jika Anda tidak bisa mengubahnya, Anda bisa menggunakan iptables untuk mengarahkan ulang port

0
Brendan

Periksa log kesalahan SSL Anda dan pastikan Anda tidak memiliki kesalahan tentang tidak dapat memverifikasi rantai sertifikat CA.

0
Neobyte