it-swarm.asia

Mod-proxy ve SSL ile Apache VirtualHost

Tümü Apache VirtualHost (aynı sunucuda çalışan Apache) üzerinden sunulacak birden fazla web uygulaması olan bir sunucu kurmaya çalışıyorum. Temel kısıtlamam, her web uygulamasının SSL şifrelemesi kullanması gerektiğidir. Bir süre googling yaptıktan ve stackoverflow ile ilgili diğer sorulara baktıktan sonra, VirtualHost için aşağıdaki yapılandırmayı yazdım:

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

https://Host.example.org:844 erişilebilir olsa da, https://Host.example.org erişilemez, bu sanal sunucumun amacını bozar yapılandırması. Firefox, sunucuya başarıyla bağlansa da bağlantının kesildiğinden şikayet ediyor. Ayrıca Apache'nin error.log dosyasında aşağıdaki uyarıyı alıyorum:

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 

Web uygulamasında (Tomcat sunucusu) erişim günlüğü garip bir erişim isteği gösterir:

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

Doğrudan https://Host.example.org:844 adresine bağlandığımda elde ettiğim doğru erişim isteği aşağıdadır:

"GET / HTTP/1.1" 302

Son olarak, SSL kullanmadığımda sanal Ana Makinenin mükemmel bir şekilde çalıştığını da belirtmeliyim.

Bunu nasıl yapabilirim?

28
JMD

Sonunda işe yarayacak bir yol buldum. Önce Dave Cheney önerisini denedim, bu yüzden Tomcat SSL olmayan bağlantı noktasına yönlendirilen Apache sunucusu için başka bir sertifika yükledim (böylece proxy http: // localhost: 8080 / ) yönlendiriyordu. Ne yazık ki, web tarayıcısında olduğu gibi tam olarak çalışmadı, https bağlantıdan hemen sonra http'ye dönüştürüldü. Bu yüzden https: // localhost: 8443 / kullanmaya geri döndüm ve çalışmasını sağlamak için son dokunuş tekrar SSLProxyEngine eklemek oldu.

Ortaya çıkan VirtualHost yapılandırması şöyledir:

<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

Bu yapılandırmayı deneyin

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

Uygulamanızın proxy bağlantısından SSL bilgilerine erişmesi gerekiyorsa, mod_proxy_ajp ve Tomcat ajp1.3 bağlayıcısını kullanmayı düşünmelisiniz.

4
Dave Cheney

Ancak hedefiniz aynı sunucuda birden fazla SSL etkin web uygulaması çalıştırmaktır. Önde Apache eklemek, yukarıdaki yapılandırmanızı kullanarak onları dengelemeyecektir, yine de bir yük dengeleyiciye ihtiyacınız olacaktır veya Apache'nin proxy dengeleyici modülünü aşağıdaki gibi bir şeyle kullanabilirsiniz:

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

Burada anlamadığım şey, Apache'nizden uygulamanıza aynı makinede görünen bir SSL bağlantınızın olması gerektiğidir ( http: // localhost: 8443 / ).

Bunun gibi şeyler kurmanın her zamanki yolu, Apache'nin "müşteri" tarafına SSL şifrelemesi sağlamasıdır; ve uygulama ile şifrelenmemiş bir bağlantıya sahip olun. Bu aynı zamanda uygulama yanıtlarınızda hata ayıklama özgürlüğü sağlar.

Dave Cheney'in bahsettiği diğer bir şey, yük dengeleme ve diğer özelliklere sahip olmak için yerel Tomcat konektörünü kullanmaktır.

1
zero_r

Gerçekten bir HTTPS hizmetine proxy göndermeniz gerekiyor mu? Localhost'ta SSL olmayan hizmete proxy uygulamak isteyebilirsiniz, ör.

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

İlk önce localhost: 8443 için bir istek yapabilir ve bak thats başarılı (IE bir GET veya wget yapmak http: // localhost: 844 ) bakın

Neden 443 numaralı bağlantı noktasını dinleyen ve daha sonra başka bir SSL Ana Bilgisayarına proxy uygulayarak sanal bir Ana Bilgisayar'a sahip olduğunuzdan emin değilim

neden uygulama sadece 443 yerli kullanamazsınız? değiştiremezseniz bağlantı noktasını yeniden yönlendirmek için iptables'ı kullanabilirsiniz

0
Brendan

SSL hata günlüğünüzü kontrol edin ve CA sertifika zincirini doğrulayamama konusunda hiçbir hatanız olmadığından emin olun.

0
Neobyte