Apache Loadbalancer와 백엔드간에 Https 사용


30

두 개의 아파치 서버 앞에서로드 밸런서로 구성된 아파치 (2.4) 서버를 사용하고 있습니다. 로드 밸런서와 백엔드 사이에 http 연결을 사용하면 정상적으로 작동하지만 https를 사용하면 작동하지 않습니다. 로드 밸런서의 구성 :

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
<Proxy balancer://testcluster>
  BalancerMember https://[Backend1]:443/test
  BalancerMember https://[Backend2]:443/test
</Proxy>
ProxyPass /test balancer://testcluster

백엔드에는 지금 자체 서명 된 인증서 만 있으므로 인증서 확인이 비활성화됩니다.

로드 밸런서의 오류 로그에는 다음이 포함됩니다.

[proxy:error] [pid 31202:tid 140325875570432] (502)Unknown error 502: [client ...] AH01084: pass request body failed to [Backend1]:443 ([Backend1])
[proxy:error] [pid 31202:tid 140325875570432] [client ...] AH00898: Error during SSL Handshake with remote server returned by /test/test.jsp
[proxy_http:error] [pid 31202:tid 140325875570432] [client ...] AH01097: pass request body failed to [Backend1]:443 ([Backend1]) from [...] ()

브라우저의 오류 페이지에는 다음이 포함됩니다.

Proxy Error

The proxy server could not handle the request GET /test/test.jsp.
Reason: Error during SSL Handshake with remote server

위에서 이미 언급했듯이 구성을 http 프로토콜 및 포트 80으로 변경하면 작동합니다. 또한 클라이언트와로드 밸런서 사이의 https 연결이 작동하므로로드 밸런서의 SSL 모듈이 올바르게 설정된 것 같습니다. https를 통해 백엔드에 직접 연결해도 오류가 발생하지 않습니다.

시간 내 주셔서 감사합니다


편집 : 알아 냈습니다. 문제는 내 인증서 공통 이름이 서버 이름과 일치하지 않는다는 것입니다. SSLProxyVerify는 아무도이 불일치를 무시 하지 않을 것이라고 생각 했지만 그렇지 않습니다. 아파치 2.4.5 이전에는 SSLProxyCheckPeerCN off를 사용 하여이 검사를 비활성화 할 수 있지만 상위 버전 (2.4.7을 사용 중)에서는 SSLProxyCheckPeerName off 도 지정해야합니다.

sslproxycheckpeername에 대한 Apache 문서

작동하는 구성은 다음과 같습니다.

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

<Proxy balancer://testcluster>
  BalancerMember https://[backend1]:443/test
  BalancerMember https://[backend1]:443/test
</Proxy>
ProxyPass /test balancer://testcluster

불행히도 평판이 부족하여 내 자신의 질문에 대답 할 수 없으므로 내 질문을 편집했습니다. 이는 비슷한 문제가 발생하는 사람에게 도움이되기를 바랍니다.


흥미 롭군 나는 이것을 apache2.2로 사용했으며 SSLProxyVerify를 사용하지 않았으며 자체 서명 인증서에 문제가 없었습니다. 백엔드 서버가 정상인지 확인하십시오.?
ETL

@ETL "SSLProxyVerify none"이 필요한지 모르겠지만, 방금 문제를 해결할 수 있다고 덧붙였습니다. 로드 밸런서 서버에서 "wget ​​https : // [backend1] /test/test.jsp --no-check-certificate"를 호출하면 예상 파일이 다운로드됩니다. ng
user3240383

답변:


16

문제는 인증서 공통 이름이 서버 이름과 일치하지 않는 것으로 판명되었습니다.

Apache 2.4.5 이전에는이 ​​검사를 사용하여 비활성화 할 수 SSLProxyCheckPeerCN off있지만 상위 버전 (예 : 2.4.7) SSLProxyCheckPeerName off에서도 지정해야합니다.

에 대한 아파치 문서 SSLProxyCheckPeerName

작동하는 구성은 다음과 같습니다.

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

<Proxy balancer://testcluster>
  BalancerMember https://[backend1]:443/test
  BalancerMember https://[backend1]:443/test
</Proxy>
ProxyPass /test balancer://testcluster

보유 하고있는 Apache 버전을 확인할 수 있습니다 .

apachectrl -V

구성이 조금 다르다는 것을 제외하고는 똑같은 문제가 있습니다. <Location /margin-tool> ProxyPass https://xxxx.thoughtworks.net:8443/margin-tool ProxyPassReverse https://xxxx.thoughtworks.net:8443/margin-tool </Location>동일한 설정이 작동하지 않습니다. 어떤 아이디어?
user157735

0

아래에 추가하면 문제가 해결되었습니다.

SSLProxyProtocol +TLSv1

5
신비한 구성 샘플을 제공하는 것은 좋은 대답이 아닙니다. 인터넷에서 문자열을 복사하여 붙여 넣는 것은 전문 시스템 관리자가하는 일이 아닙니다. 그것이 무엇이며 왜 그런지 설명하십시오.
peterh는 Monica Monica를

java12와 함께 이것에
부딪쳤다

-2

나는 아파치 2.4.9를 사용하고 httpd-ssl.conf에 다음 코드를 추가한다

SSLProxy 프로토콜 + SSLv3 + TLSv1 + TLSv1.1

나는 문제를 해결했다


3
푸들에 대해 들어 본 적이 있습니까? SSLv3을 비활성화해야합니다.
Sven

2
SSLv3는 취약합니다
내부자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.