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?
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>
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.
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
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.
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/
İ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
SSL hata günlüğünüzü kontrol edin ve CA sertifika zincirini doğrulayamama konusunda hiçbir hatanız olmadığından emin olun.