Mod proxy ve SSL ile Apache VirtualHost


28

Apache VirtualHost (aynı sunucuda çalışan apache) aracılığıyla sunulacak olan birden fazla web uygulamasıyla bir sunucu kurmaya çalışıyorum. Ana kısıtım, her web uygulamasının SSL şifrelemesi kullanması gerektiğidir. Bir süre googling yaptıktan ve stackoverflow ile ilgili diğer soruları inceledikten 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:8443 erişilebilir olmasına rağmen , sanal ana bilgisayar yapılandırmamın amacını yitiren https://host.example.org değil. Firefox, sunucuya başarıyla bağlanmasına rağmen 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 (bir Tomcat sunucusu) erişim günlüğü garip bir erişim isteği gösteriyor:

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

Aşağıda, doğrudan https://host.example.org:8443’e bağlandığımda elde ettiğim doğru erişim yanıtı verilmiştir :

"GET / HTTP/1.1" 302

Son olarak, SSL kullanmadığımda sanal ana bilgisayarın mükemmel çalıştığını da belirtmeliyim.

Bu işi nasıl yapabilirim?

Yanıtlar:


34

Sonunda çalışmasını sağlayacak bir yol buldum. Önce Dave Cheney'nin önerisini denedim, bu yüzden Tomcat’in SSL olmayan portuna yönlendirilen apache sunucusu için başka bir sertifika kurdum (bu yüzden proxy http: // localhost: 8080 / sayfasına yönlendiriliyordu ). Maalesef web tarayıcısında olduğu gibi tam olarak çalışmadı, https bağlantısı hemen sonra http'e dönüştürüldü. Bu yüzden https: // localhost: 8443 / kullanmaya geri döndüm ve çalışması için son dokunuş tekrar SSLProxyEngine eklemek oldu.

Sonuçta ortaya çıkan VirtualHost yapılandırması:

<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
Önlemek ProxyPreserveHost On, neredeyse her zaman yanlıştır yararsız ve hemen hemen her zaman sonları ProxyPassReverse. Bir yan not ProxyRequests offolarak, varsayılan, böylece gereksiz.
kubanczyk

Harici IP kullandığımız zaman localhostişe yaramaz.
Chaminda Bandara

4

Bu yapılandırmayı dene

<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ıdan gelen SSL bilgilerine erişmesi gerekiyorsa, mod_proxy_ajp ve tomcat ajp1.3 konektörünü kullanmayı düşünmelisiniz.


Ben host.domain.org başvurusunun çalıştığı sunucuda şifrelemeyle sertifikayı oluşturacağım. Öyleyse proxy sunucusunda aynı sertifikayı yeniden kullanmak zorunda mıyım?
Giox

2

Ancak, hedefiniz aynı sunucuda birden çok ssl etkin web uygulamasını çalıştırmaktır. önüne apache eklemek yukarıdaki yapılandırma kullanarak onları dengeleyecek değil, hala bir yük dengeleyicisine ihtiyacınız olacak 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

Şu anda gerçekten yük dengeleme kullanmama gerek yok, ancak bu gelecekte de sakıncalı olabilir. İçgörü için teşekkürler.
JMD

1

Anlayamadığım şey, neden aynı makinede göründüğü gibi, apache uygulamanızdan uygulamanıza bir SSL bağlantısına sahip olmanız gerektiğidir ( http: // localhost: 8443 / ).

Bunun gibi şeyleri ayarlamanın genel yolu, örneğin internet gibi "müşteriye" SSL şifrelemesi sağlayan bir apache'ye sahip olmak ve uygulama ile şifrelenmemiş bir bağlantı kurmak. Bu, ayrıca uygulama yanıtlarınızı hata ayıklamak için daha fazla özgürlük verir.

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


Böyle bir düzeni seçmek için iki nedenim var. Birincisi, Tomcat sunucusunun zaten SSL ile çalışıyor ve çalışıyor olması ve onunla apache VirtualHost kullanmanın kolay olacağını düşündüm. İkincisi, uygulamanın sağlayıcısının (JIRA) apache entegrasyonu için bazı kılavuzlar sağladığı ( atlassian.com/software/jira/docs/v3.13/apacheintegration.html ) ve yapılandırmamı VirtualHost desteği ekleyerek temel aldım. Sanırım bu düşündüğümden daha karmaşıktı, çalışmasını sağlamanın yanı sıra, sorunun ne olduğunu anlamak istiyorum.
JMD

0

Gerçekten bir HTTPS servisine proxy ihtiyacınız var mı? Localhost'taki ssl olmayan hizmete proxy isteyebilirsiniz, örneğin:

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

Gerçekten de SSL kullanmak benim için zorunlu. Ben de sadece kontrol etmek için SSL kullanmadan proxy'ye test ettim ve iyi çalışıyor. SSL desteği asıl konudur.
JMD

0

İlk olarak localhost'tan localhost: 8443'e bir istek yapıp yapamayacağınıza ve bunun başarılı olup olmadığına bakardım (IE bir GET yapın ya da http: // localhost: 8443 ).

Havin ga sanal sunucunuzun neden 443 numaralı bağlantı noktasını dinlediğini ve sonra onu başka bir ssl ana bilgisayarına sağladığından emin değilim.

neden uygulama yalnızca 443'ü yerel olarak kullanamıyor? değiştiremezseniz, bağlantı noktasını yönlendirmek için iptables kullanabilirsiniz.


Bunun nedeni, aynı sunucuya daha fazla web uygulaması yüklemem gerekiyor, hepsi SSL kullanıyor ve hepsi de 443 numaralı bağlantı noktasını dinleyemiyor. Bu yüzden, her web uygulamasının kendi sunucusunda barındırılıyormuş gibi görünmesini sağlamak için IP tabanlı VirtualHosts kullanıyorum. Aşağıdaki wget komutunu test ettim ve iyi çalışıyor: wget localhost: 8443 - no-check-sertifika
JMD

2
Not - Sunucunuza ek IP adresleri eklemek basit bir meseledir ve bu nedenle 443 numaralı bağlantı noktasını dinleyen birkaç uygulama vardır - hepsi ayrı IP adreslerinde.
Brent,

0

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


Gerçekten doğrulama hataları varsa, çözüm ne olurdu?
Javier Méndez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.