mod-proxy 및 SSL을 사용하는 Apache VirtualHost


28

아파치 VirtualHost (동일한 서버에서 실행되는 아파치)를 통해 모두 제공되는 여러 웹 응용 프로그램으로 서버를 설정하려고합니다. 내 주요 제약 조건은 각 웹 응용 프로그램이 SSL 암호화를 사용해야한다는 것입니다. 인터넷 검색을 한 후 stackoverflow에 대한 다른 질문을 살펴본 후 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>

비록 https://host.example.org:8443가 접근, https://host.example.org는 내 가상 호스트 설정의 목적을 패배하는 없습니다. Firefox는 서버에 성공적으로 연결되었지만 연결이 중단되었다고 불평합니다. 또한 Apache의 error.log에 다음 경고가 표시됩니다.

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 

웹 애플리케이션 (Tomcat 서버)에서 액세스 로그에 이상한 액세스 요청이 표시됩니다.

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

다음은 https://host.example.org:8443에 직접 연결할 때 얻는 올바른 액세스 요청입니다 .

"GET / HTTP/1.1" 302

마지막으로 SSL을 사용하지 않으면 가상 호스트가 완벽하게 작동한다고 언급해야합니다.

이 작업을 어떻게 수행 할 수 있습니까?

답변:


34

마침내 나는 그것을 작동시키는 방법을 찾았다. 먼저 Dave Cheney 제안을 시도 했으므로 Tomcat 비 SSL 포트로 리디렉션 된 Apache 서버에 대한 다른 인증서를 설치했습니다 (따라서 프록시는 http : // localhost : 8080 / 로 리디렉션되었습니다 ). 불행히도 웹 브라우저에서 https가 연결 즉시 http로 변환 된 것처럼 완전히 작동하지 않았습니다. 그래서 https : // localhost : 8443 / 사용으로 돌아 갔고 마지막으로 SSLProxyEngine을 다시 추가했습니다.

결과 VirtualHost 구성은 다음과 같습니다.

<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
ProxyPreserveHost On거의 항상 잘못되고 쓸모없고 거의 항상 깨지는 것을 피하십시오 ProxyPassReverse. 부수적 ProxyRequests off으로 기본값이므로 중복됩니다.
kubanczyk

외부 IP를 사용하는 대신 localhost작동하지 않습니다.
Chaminda Bandara

4

이 구성을 사용해보십시오

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

애플리케이션이 프록시 연결에서 SSL 정보에 액세스해야하는 경우 mod_proxy_ajp 및 tomcat ajp1.3 커넥터 사용을 고려해야합니다.


host.domain.org 용 응용 프로그램이 실행되는 서버에서 암호화하도록 인증서를 생성합니다. 그런 다음 프록시 서버에서 동일한 인증서를 재사용해야합니까?
Giox

2

그러나 목표라면 동일한 서버에서 여러 개의 SSL 지원 웹 응용 프로그램을 실행하는 것입니다. 아파치를 앞에 추가하면 위의 구성을 사용하여 균형을 잡을 수 없으며 여전히로드 밸런서가 필요하거나 아파치의 프록시 밸런서 모듈을 다음과 같이 사용할 수 있습니다.

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

현재 실제로로드 밸런싱을 사용할 필요는 없지만 앞으로는 그럴 수 있습니다. 통찰력에 감사드립니다.
JMD

1

글쎄, 내가 여기서 이해하지 못하는 것은 아파치에서 동일한 컴퓨터에있는 것처럼 보이는 응용 프로그램에 대한 SSL 연결이 필요한 이유입니다 ( http : // localhost : 8443 / ).

이와 같은 것을 설정하는 일반적인 방법은 인터넷과 같은 "고객"측에 SSL 암호화를 제공하고 응용 프로그램에 암호화되지 않은 연결을하는 것입니다. 또한 응용 프로그램 응답을보다 자유롭게 디버깅 할 수 있습니다.

Dave Cheney가 언급 한 다른 것은로드 밸런싱 및 기타 기능을 위해 기본 Tomcat 커넥터를 사용하는 것입니다.


그런 설정을 선택 해야하는 두 가지 이유가 있습니다. 첫 번째는 Tomcat 서버가 이미 SSL로 실행 중이며 아파치 VirtualHost를 사용하는 것이 간단하다고 생각했습니다. 두 번째는 애플리케이션 제공자 (JIRA)가 아파치 통합에 대한 몇 가지 지침 ( atlassian.com/software/jira/docs/v3.13/apacheintegration.html )을 제공하고 VirtualHost 지원을 추가하여 구성을 기반으로한다는 것입니다. 내가 생각했던 것보다 더 복잡하다고 생각합니다. 효과를내는 것 외에도 문제가 무엇인지 간증하고 싶습니다.
JMD

0

실제로 HTTPS 서비스를 프록시해야합니까? localhost에서 SSL이 아닌 서비스로 프록시하려고 할 수 있습니다.

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

실제로 SSL을 사용해야합니다. 또한 확인을 위해 SSL을 사용하지 않고 프록시로 테스트했으며 정상적으로 작동합니다. SSL 지원은 실제 문제입니다.
JMD

0

먼저 localhost에서 localhost : 8443으로 요청을 할 수 있는지 확인하고 성공했는지 확인하십시오 (IE는 GET 또는 http : // localhost : 8443을 수행하십시오 )

왜 havin ga 가상 호스트가 포트 443을 수신하고 다른 SSL 호스트로 프록시하는지 왜 잘 모르겠습니다.

왜 응용 프로그램이 기본적으로 443을 사용할 수 없습니까? 변경할 수 없으면 iptables를 사용하여 포트를 리디렉션 할 수 있습니다.


그 이유는 SSL을 사용하여 동일한 서버에 더 많은 웹 응용 프로그램을 설치해야하고 포트 443에서 모두 수신 할 수 없기 때문입니다. 따라서 각 웹 응용 프로그램이 자체 서버에서 호스팅되는 것처럼 보이도록 IP 기반 VirtualHost를 사용하고 있습니다. 다음 wget 명령을 테스트했으며 제대로 작동합니다. wget localhost : 8443 --no-check-certificate
JMD

2
참고-서버에 추가 IP 주소를 추가하는 것은 간단하므로 포트 443에서 여러 응용 프로그램이 모두 별도의 IP 주소에서 수신 대기합니다.
Brent

0

SSL 오류 로그를 확인하고 CA 인증서 체인을 확인할 수 없다는 오류가 없는지 확인하십시오.


실제로 확인 오류가 있다면 해결책은 무엇입니까?
Javier Méndez 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.