การตั้งค่า SSL พร้อม apache หน้า Tomcat


9

ฉันกำลังพยายามตั้งค่า Apache ด้วย SSl และการร้องขอ SSL กับพร็อกซี Tomcat ของฉัน ฉันคิดว่าฉันทำงาน SSL แต่ยังมีข้อผิดพลาดที่ปรากฏขึ้น:

Bad Gateway

The proxy server received an invalid response from an upstream server.

* SSL Virtualhost *

LoadModule ssl_module modules/mod_ssl.so

Listen 443
<VirtualHost _default_:443>
SSLEngine On
SSLProxyEngine On
DocumentRoot "/var/apache-tomcat-7.0.34/webapps/Learn2Gether/"

SSLCertificateFile /etc/pki/tls/learn2gether/cert-6090205098829887.pem
SSLCertificateKeyFile /etc/pki/tls/learn2gether/private_key_unlocked.pem
SSLCertificateChainFile /etc/pki/tls/learn2gether/rubca-chain.pem


BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

ServerName www.learn2gether.rubel.rub.de
ServerAlias learn2gether.rubel.rub.de

#RewriteRule ^\/$ /Learn2Gether/index.html [PT]
##RewriteRule ^/(.*)$ /$1 [PT]

ProxyRequests Off
ProxyPreserveHost On
ProxyPass / https://localhost:8443/
ProxyPassReverse / https://localhost:8443/

</VirtualHost>
~               

HTTP VH เปลี่ยนเส้นทางไปที่ HTTPS

NameVirtualHost *:80

<VirtualHost _default_:80>
   ServerName www.learn2gether.rubel.rub.de
   ServerAlias learn2gether.rubel.ruhr-uni-bochum.de
RewriteEngine on
# DocumentRoot "/var/apache-tomcat-7.0.34/webapps/Learn2Gether/"
RewriteCond %{HTTP_HOST} !^learn2gether.rubel.ruhr-uni-bochum\.de [NC]
RewriteRule ^/(.*)$ http://learn2gether.rubel.ruhr-uni-bochum.de/$1 [R=301,L]

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}$1 [L]

#RewriteRule ^\/$ /Learn2Gether/index.html [PT]
#RewriteRule ^/(.*)$ /$1 [PT]

#ProxyPass / https://localhost:8443/
#ProxyPassReverse / https://localhost:8443/
</VirtualHost>

Tomcats apache connector

    <Connector port="8443"
  protocol="HTTP/1.1"
   connectionTimeout="20000"
    compression="on"
     compressionMinSize="32"
      noCompressionUserAgents="gozilla, traviata"
       compressableMimeType="text/html,text/xml,text/javascript,application/x-javascript,text/css"
        redirectPort="8443"
         URIEncoding="UTF-8"
          proxyPort="443"
           proxyName="learn2gether.rubel.ruhr-uni-bochum.de"
            scheme="https"
             secure="true"
/>

เซิร์ฟเวอร์ Tomcat ถูกกำหนดค่าด้วยใบรับรองที่ลงชื่อด้วยตนเองหรือไม่ นอกจากนี้หากคุณใช้ apache เป็นส่วนหน้าของ ssl สำหรับ tomcat ทำไมคุณถึงใช้ ssl บนเซิร์ฟเวอร์ tomcat ด้วย? แนวทางปฏิบัติที่ดีที่สุดคือให้ Tomcat ของคุณตอบสนองต่อ HTTP และลดการโหลด https ไปยังเซิร์ฟเวอร์ apache
Krist van Besien

คำตอบ:


14

เมื่อพร็อกซี http หรือ https เพื่อ https คุณต้องกำหนดค่า Apache เป็น SSL ลูกค้า เมื่อ apache พูดคุยกับเซิร์ฟเวอร์ Tomcat ของคุณจะทำหน้าที่เป็นเว็บไคลเอ็นต์หลังจากทั้งหมด อย่างไรก็ตาม Apache มักจะไม่ทำงานเป็นไคลเอนต์ SSL ออกจากกล่อง

ประการแรกฉันขอแนะนำให้คุณพิจารณาก่อนว่าคุณต้องการสิ่งนี้จริงๆหรือไม่ทำไมคุณถึงทำสิ่งนี้ การปฏิบัติทั่วไปเมื่อ Tomcat และ Apache ใช้งานบนเซิร์ฟเวอร์เดียวกันคือการให้ Tomcat ให้บริการ http ธรรมดา (หรือ ajp) และ offload ssl ไปยังเซิร์ฟเวอร์ Apache โดยปกติไม่จำเป็นต้องมี ssl ระหว่างเซิร์ฟเวอร์ apache และ tomcat การไม่มี ssl บนเซิร์ฟเวอร์ Tomcat จะช่วยให้คุณประหยัดได้มาก

สิ่งที่คุณต้องทำคือกำหนดตัวเชื่อมต่อ HTTP บนพอร์ต 8080 ในอินสแตนซ์ tomcat ของคุณและเปลี่ยนเส้นทางคำขอทั้งหมดจากภายใน apache SSL โฮสต์เสมือนของคุณ:

<VirtualHost _default_:443>
SSLEngine On

SSLCertificateFile /etc/pki/tls/learn2gether/cert-6090205098829887.pem
SSLCertificateKeyFile /etc/pki/tls/learn2gether/private_key_unlocked.pem
SSLCertificateChainFile /etc/pki/tls/learn2gether/rubca-chain.pem


BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

ServerName www.learn2gether.rubel.rub.de
ServerAlias learn2gether.rubel.rub.de

ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

</VirtualHost>

แต่ถ้าคุณยังตัดสินใจว่าคุณต้องการใช้ ssl to sx proxying คุณจะต้องเพิ่มการเปลี่ยนแปลงเพิ่มเติม Apache จะต้องสามารถทำงานเป็นไคลเอนต์ SSL รวมถึงเซิร์ฟเวอร์ SSL ได้ เมื่อ Apache พูดกับเซิร์ฟเวอร์อื่นที่ใช้ https มันจะทำหน้าที่เป็นไคลเอนต์ทั้งหมด นี่ไม่ใช่เรื่องง่ายและมีปัญหามากมายที่คุณสามารถเรียกใช้ได้ คุณจะต้องเพิ่มสิ่งนี้:

# turn on SSL proxying.
SSLProxyEngine On

# to tell Apache where to find CA certificates to check server certificates with:
# (You can choose yourself where you put these certificates)
SSLProxyCACertificatePath /path/to/ca/certificates.

จากนั้นในเส้นทางนี้คุณจะต้องวางหนังสือรับรอง CA ที่ใช้ในการลงนามหนังสือรับรองที่ใช้โดยเซิร์ฟเวอร์ที่คุณสื่อสารด้วย หากคุณใช้ใบรับรอง "ลงชื่อด้วยตนเอง" คุณจะต้องใส่ไว้ใน dir นี้

เมื่อคุณทำเสร็จแล้วคุณต้องเรียกใช้ "c_rehash" ในไดเรกทอรีนั้น c_rehash เป็นส่วนหนึ่งของการกระจาย openssl มาตรฐาน c_rehash สร้างนามแฝงที่แฮชใน dir นี้ Apache ต้องการสิ่งเหล่านี้

ในการทดสอบว่ามีทุกอย่างอยู่ที่นี่หรือไม่

 openssl s_client -CApath /path/to/ca/certificates -connect remoteserver:8443

หากการเชื่อมต่อสำเร็จคุณจะได้รับพรอมต์ซึ่งคุณสามารถพิมพ์คำขอได้ ลองทำอะไรซักอย่าง

 GET /

และดูว่าคุณได้อะไร หากการทดสอบนี้ประสบความสำเร็จ apache ควรทำงานด้วย

ตอนนี้คุณสามารถเพิ่มคำสั่ง ReWriteRule หรือ Proxy เพื่อส่งต่อการเชื่อมต่อไปยังเซิร์ฟเวอร์ https ของคุณ


ฉันใหม่จริง ๆ ที่ .. ฉันจะใช้ apache เพียงแค่ ssl และเปลี่ยนเส้นทางเพียงแค่กับ http ได้อย่างไร
SaifDeen

ฟังดูง่ายขึ้น .. ฉันแค่อยากได้ ssl สำหรับส่วนหน้า ...
SaifDeen

หากคุณต้องการใช้ apache เป็น ssl frontend สำหรับ Tomcat สิ่งที่คุณต้องทำคือกำหนดค่าตัวเชื่อมต่อ http หรือ ajp บนเซิร์ฟเวอร์ tomcat ของคุณและมี apache forward ร้องขอ
Krist van van Besien

ไม่ลองตอนนั้นวันจันทร์!
SaifDeen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.