mod-proxy 및 SSL을 사용하는 Apache VirtualHost 다른 질문을 살펴본 후

아파치 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을 사용하지 않으면 가상 호스트가 완벽하게 작동한다고 언급해야합니다.

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



답변

마침내 나는 그것을 작동시키는 방법을 찾았다. 먼저 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>


답변

이 구성을 사용해보십시오

<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 커넥터 사용을 고려해야합니다.


답변

그러나 목표라면 동일한 서버에서 여러 개의 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


답변

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

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

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


답변

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

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


답변

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

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

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


답변

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